我有一个多线程实现,其中我创建了一个ExecutorService并提交要执行的任务,我想知道所有已提交的线程何时完成,而不会阻塞主线程和UI。我尝试过ExecutorService.awaitTermination()
,但它会阻塞主线程和UI。我搜索了很多,但似乎找不到一种优雅的方法来做到这一点。我目前考虑创建另一个线程来计算完成的线程数量,并在它们全部完成时启动一个事件,但这似乎不是一个好的方法,我想要更好的解决方案!
我有一个多线程实现,其中我创建了一个ExecutorService并提交要执行的任务,我想知道所有已提交的线程何时完成,而不会阻塞主线程和UI。我尝试过ExecutorService.awaitTermination()
,但它会阻塞主线程和UI。我搜索了很多,但似乎找不到一种优雅的方法来做到这一点。我目前考虑创建另一个线程来计算完成的线程数量,并在它们全部完成时启动一个事件,但这似乎不是一个好的方法,我想要更好的解决方案!
SwingWorker
关闭线程池并调用awaitTermination()
。这将防止UI阻塞,并在您的SwingWorker实现上从事件分派线程调用done()
,您可以使用它来触发任何所需的UI更改。publish()
,然后将其传递到EDT上的process()
实现。 final ExecutorService execSvc = ...;
execSvc.submit(task1);
...
execSvc.submit(taskN);
// important to request the exec service to shut down :)
execSvc.shutdown();
new Thread(new Runnable() {
public void run() {
while (!execSvc.isTerminated()) {
try {
execSvc.awaitTermination(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// ignore exception
}
}
System.out.println("ExecSvc.run: exec service has terminated!");
// possibly submit a task using SwingUtilities.invokeLater() to update the UI
}
}).start();
latch.countDown();在ExecutorService上,您可以调用shutdown(),然后再调用awaitTermination()。
isTerminated()
方法就可以了。
但是需要注意的是,只有在调用 shutdown
方法后,awaitTermination
和 isTerminated
才会给出有意义的结果。