Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SwingWorker:CPU使用率100%!_Java_Swing_User Interface_Swingworker - Fatal编程技术网

Java SwingWorker:CPU使用率100%!

Java SwingWorker:CPU使用率100%!,java,swing,user-interface,swingworker,Java,Swing,User Interface,Swingworker,我的Swing应用程序有一个表,当从外部源获取某些数据时,会填充该表。要显示数据,我正在使用SwingWorker线程,该线程从本应以这种方式获取数据的线程调用: // SwingWorker Thread private class DisplayRowsTask extends SwingWorker<Void, Object[]> { private Vector<String[]> _data; @Override protecte

我的Swing应用程序有一个表,当从外部源获取某些数据时,会填充该表。要显示数据,我正在使用SwingWorker线程,该线程从本应以这种方式获取数据的线程调用:

 // SwingWorker Thread
 private class DisplayRowsTask extends SwingWorker<Void, Object[]> {

    private Vector<String[]> _data;

    @Override
    protected Void doInBackground() {
        while (_continue && !hasError()) {
            // some logic to fetch and place data in _data
            // data adjustment
            for (String[] row : _data) publish (row);
            _data = new Vector<String[]>();
        }
        return null;
    }

    @Override
    protected void process(List<Object[]> rows) {
        for (Object[] row : rows) ((DefaultTableModel)_table.getModel()).addRow(row);
    }
}
//SwingWorker线程
私有类DisplayRowsTask扩展SwingWorker{
专用矢量数据;
@凌驾
受保护的Void doInBackground(){
而(_continue&!hasrerror()){
//在_数据中获取和放置数据的一些逻辑
//数据调整
对于(字符串[]行:_数据)发布(行);
_数据=新向量();
}
返回null;
}
@凌驾
受保护的无效进程(列出行){
对于(对象[]行:行)((DefaultTableModel)\u table.getModel()).addRow(行);
}
}
显示的结果是正确的,除了CPU使用率为100%(甚至更高!)之外,一切正常,特别是在频繁获取大量数据的情况下。我如何限制这种用法


另一个可能不完全相关的问题是:如何知道数据是否显示在表中?方法“SwingWorker.isDone()”没有提供此信息,因为(!task.isDone())时,您的CPU会自然地达到100%,因为您正在空闲地循环(/strong>
run()
中<通过调用
execute()异步执行code>SwingWorker
这样您就不必在
线程中执行它了。无论如何,在Swing中都不应该使用
Thread
SwingWorker
完成这项工作。它有钩子方法在代码完成时调用代码。 如果您有许多任务要执行,请在
SwingWorker
本身中执行这些任务

大概是这样的:

   @Override
    protected Void doInBackground() {
      while (_continue && !hasError()) {
        // do some adjustments around _data
        for (String[] row : _data) publish (row);
       }
       return null;
    }
关于另一个问题: 我想,
addRow(…)
fires事件。您的表应该获取此事件并使组件无效。如果要在SwingWorker完成后执行代码,请重写
done()
方法。

不回答

不知道您尝试了什么,因为我无法通过实现正确地生成100%的CPU使用率,如果您是IDE用户,那么您可以使用内置的
JProfiler
评测代码,然后在那里您可以看到当前JVM中的所有重要事件,但基本上您有三个选择

1) 机具,请注意

2) 通过将方法包装到,注意到GUI的输出必须包装到
invokeLater

3) 创建一些,注意到GUI的输出必须打包到
invokeLater
,在某些情况下需要打包到
invokeAndWait


4) 您可以模拟/比较性能问题

您确实应该重新阅读SwingWorker的文档。主线程不应该循环并创建几个SwingWorker实例。SwingWorker应该循环并以增量和异步方式填充表。必须获取数据的是后台线程,而不是主线程。谢谢我重新编辑了代码,但我仍然有100%的CPU。为了更快地获得更好的帮助,请发布一条消息。何时停止循环?如果后台线程无休止地循环,您当然会有100%的CPU使用率。@JB Nizet愚蠢的问题--->我认为在今天的PC上,单线程100%占用CPU是不可能的,还是我错了???谢谢我重新编辑了我的代码(顺便说一句,与您的代码类似),但我仍然有100%的CPU使用率:|