我正在根据需要建立多个连接来生成 SwingWorkers。我尝试设置一个固定数量的最大并行 SwingWorkers,当其中一个完成时,另一个将被启动(或许多个已经完成的任务将被启动)。根据http://java.dzone.com/articles/multi-threading-java-swing,我像这样设置基本的SwingWorker:
现在我不确定如何实现我上面描述的机制。
从https://dev59.com/Q2sy5IYBdhLWcg3wvgdk#8356896我看到我可以使用ExecutorService执行SwingWorker的实例,而这个接口也允许设置线程数:
我认为这就是我需要的东西,但我不知道如何将所有内容组合在一起(..我对Java也很陌生..)。有人可以在实现过程中给我一些指导吗?比如说,在顶部我有
更新: 我已经按照以下方式设置了ExecutorService:
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://dev59.com/Q2sy5IYBdhLWcg3wvgdk#8356896我看到我可以使用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()
调用,但是从控制台输出仅有一行"One SwingWorker just ran!",这是为什么?我做错了什么吗?