我正在根据我需要建立的多个连接生成SwingWorkers。我试图让我设置一个固定数量的最大并发SwingWorkers,当其中一个完成另一个启动时(或许多其他启动时,如果很多完成)。基于http://java.dzone.com/articles/multi-threading-java-swing我设立基本的SwingWorker这样的:
如何正确使用ExecutorService来管理并发运行的SwingWorkers的数量?
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);
}
与我已删除worker.execute()
叫做SwingWorker的后上方,但从控制台输出仅仅是一个单一的“一个SwingWorker刚跑过!“一行,那是怎么回事?我做错了什么?
正如我在您之前的问题中注意到的,SwingWorkers实例的数量正在稳定运行,SwingWorker从Future初始化,并且无法保证每个实例在同一时间结束或者另一个实例已启动(对于使用Thread的逻辑也是有效的,但没有错误),带有Runnable的逻辑#Thead更好,更容易和更舒适,get()完成()用于捕获可能的异常,而不是返回 – mKorbel
我对他们在此完成的次序不感兴趣案件。不确定你的意思是“没有错误”。在我为SwingWorker done()和get()读取的所有文档中,它们分别用于发出回调方法,该方法1)可以访问SwingWorker doInBackground()的返回值,以及2)可以安全地更新GUI(因为它是自动的在美国东部时间推出)。我不确定是否引用其他get()和done()方法,但我不知道它们是否也用于Runnable#Thread。 –
1.你可以[获取()一个异常或返回](发布时间:15年07月01日原作者: )/ setProcess – mKorbel