rtf*_*inc 11 java swing swingworker
我的电脑有4个内核,我正在运行Java swing gui程序.当我运行我的应用程序时,它只使用两个内核和大约30%的CPU利用率.我有大量要处理的文件,并希望将它们分成两个线程,以便使用更多的cpu更快地完成此任务.
我有一个名为PrepareTask的SwingWorker类,它有一个带有两个int的构造函数:
class PrepareTask extends SwingWorker<Void, Void> {
int start, end;
PrepareTask (int start, int end) { ... }
...
public Void doInBackground() {... }
public void done() { ... }
Run Code Online (Sandbox Code Playgroud)
我创建了两个这样的实例:
PrepareTask prepareTask = new PrepareTask(0,numberOfFiles/2);
prepareTask.execute();
PrepareTask prepareTask2 = new PrepareTask(numberOfFiles/2, numberOfFiles);
prepareTask2.execute();
Run Code Online (Sandbox Code Playgroud)
两者都启动(看起来)但是当它运行时我可以看到(打印stmts)第一个准备必须完成(在第二个开始之前打印内部).CPU利用率与以前相同,约为30%.它们当然都从同一个源中获取数据,即DefaultTableModel.
关于如何做到这一点或我做错了什么的想法?谢谢.
use*_*396 16
这是SwingWorker行为从一个Java 6更新更改为另一个Java 6更新的结果.在Java 6的旧SUN bug数据库中实际上存在关于它的错误报告.
发生的事情是SUN将原始的SwingWorker实现从使用N个线程改为使用1个具有无界队列的线程.因此,您不能再同时运行两个SwingWorkers.(这也会产生一种可能发生死锁的情况:如果一个swingworker等待另一个等待第一个,则一个任务可能会因此而进入死锁.)
你可以做些什么来解决这个问题,使用ExecutorService并在其上发布FutureTasks.这些将提供99%的SwingWorker API(SwingWorker是FutureTask衍生物),您所要做的就是正确设置您的Executor.
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |