【发布时间】:2014-04-30 17:12:07
【问题描述】:
我正在根据需要建立的许多连接生成 SwingWorker。我正在努力做到这一点,以便我设置固定数量的最大并发 SwingWorkers 并且当其中一个完成时启动另一个(或者如果许多人已经完成,则启动许多其他人)。基于http://java.dzone.com/articles/multi-threading-java-swing,我正在像这样设置基本的 SwingWorker:
SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
System.out.println("One SwingWorker just ran! ");
}
return true;
}
// Can safely update the GUI from this method.
protected void done() {
boolean status;
try {
// Retrieve the return value of doInBackground.
status = get();
statusLabel.setText("Completed with status: " + status);
} catch (InterruptedException e) {
// This is thrown if the thread's interrupted.
} catch (ExecutionException e) {
// This is thrown if we throw an exception
// from doInBackground.
}
}
};
worker.execute();
现在我不确定如何实现我上面描述的机制。
从https://stackoverflow.com/a/8356896/988591 看到我可以使用 ExecutorService 来执行 SwingWorker 的实例,并且这个接口还允许设置线程数:
int n = 20; // Maximum number of threads
ExecutorService threadPool = Executors.newFixedThreadPool(n);
SwingWorker w; //don*t forget to initialize
threadPool.submit(w);
我认为这是我需要的,但我不知道如何将整个事情放在一起(..我对 Java 也很陌生..)。有人可以在实施这个过程中指导我吗?在顶部说我有int totalTask = 100; 也许这只是一些循环的问题,但我似乎找不到任何真正容易理解的例子,我只是还不能完全理解它所以..我会很感激一些帮助!谢谢。
更新:我已经这样设置了 ExecutorService:
ExecutorService executorService = Executors.newFixedThreadPool(500);
for (int i = 0; i < 20 ; i++) {
executorService.submit(worker);
//I tried both...
//executorService.execute(worker);
}
我已经删除了在上面的 SwingWorker 之后调用的 worker.execute(),但是 控制台的输出只是一个“一个 SwingWorker 刚刚运行!” 行,这是怎么回事?我做错了什么?
【问题讨论】:
-
正如我在您之前的问题中注意到的那样,仔细考虑同时运行的 SwingWorkers 实例的数量,SwingWorker 是从 Future 初始化的,并且不能保证每个实例都在同一时间结束或在另一个实例启动之前结束(有效对于带有 Thread 的逻辑,但没有错误),带有 Runnable#Thead 的逻辑更好,更容易和舒适,done() 中的 get() 用于捕获可能的异常,而不是用于返回
-
我对他们在这种情况下完成的顺序不感兴趣。不确定“但没有错误”是什么意思。在我为 SwingWorker done() 和 get() 阅读的所有文档中,它们分别用于发出回调方法,该方法 1) 可以访问 SwingWorker doInBackground() 的返回值和 2) 可以安全地更新 GUI(因为它是自动在 EDT 中推出)。我不确定您是否引用其他 get() 和 done() 方法,我不知道它们是否也用于 Runnable#Thread。
-
1.你可以get() an exception or returns 2.publish()/setProcess
-
嘿...我在这里也有同样的经历。但是我所有的摇摆工人都很好,他们完成了这项工作。唯一奇怪的是 done() 方法只调用了一次,就像你经历过的一样。
标签: java swing threadpool executorservice swingworker