gpt4 book ai didi

java - SwingWorker:CPU 使用率 100%!

转载 作者:行者123 更新时间:2023-11-30 04:54:49 24 4
gpt4 key购买 nike

我的 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);
}
}

显示的结果是正确的,除了 CPU 使用率为 100%(甚至超过!)之外,一切工作正常,尤其是在频繁获取大量数据的情况下。我如何限制这种使用?

另一个问题可能不完全相关:我如何知道数据是否显示在表格中?方法“SwingWorker.isDone()”不提供此信息

最佳答案

你的CPU自然会达到100%,因为你在空闲循环 while (!task.isDone()); in run() SwingWorker 通过调用 execute(); 异步执行,因此您不必在 Thread 中执行它。无论如何,您都不应该在 Swing 中使用ThreadSwingWorker 完成这项工作。它有钩子(Hook)方法来在代码完成时调用它。如果您有许多任务要执行,请在 SwingWorker 本身中实现它们。

类似这样的事情:

   @Override
protected Void doInBackground() {
while (_continue && !hasError()) {
// do some adjustments around _data
for (String[] row : _data) publish (row);
}
return null;
}

另一个问题:我认为 addRow(...) 会触发事件。您的表应该收到此事件并使组件无效。如果您想在 SwingWorker 完成后执行代码,请重写 done() 方法。

关于java - SwingWorker:CPU 使用率 100%!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com