Java SwingWorker:CPU使用率100%!
我的Swing应用程序有一个表,当从外部源获取某些数据时,会填充该表。要显示数据,我正在使用SwingWorker线程,该线程从本应以这种方式获取数据的线程调用: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
// 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使用率:|