我有一个多线程的实现,我创建一个ExecutorService并提交要执行的任务,我想知道什么时候所有线程都已完成而没有阻塞主线程和UI。我试过ExecutorService.awaitTermination()
,但它阻止了主线程和用户界面。我搜索了很多,但我似乎无法找到一个这样做的优雅方式。我目前正在考虑创建另一个线程来计算完成的线程数量,并在完成时启动一个事件,但这不是一个好方法,而且我想要一个更好的解决方案!ExecutorService,如何知道所有线程何时完成而不阻塞主线程?
回答
isTerminated()
会做
不过请注意,这两个awaitTermination
和isTerminated
只会给你一个有意义的结果,你都呼吁shutdown
我发现了一些关于isTerminated()的内容,但仍然认为我需要在“side thread”上运行它来经常检查它是否返回true,从而将我带入我的初始解决方案! – Trota 2012-03-20 00:15:11
使用SwingWorker
来关闭线程池,并调用awaitTermination()
后。这将防止UI阻塞,并从SwingWorker实现上的Event Dispatch Thread中调用done()
,您可以使用它来触发您所需的任何UI更改。
如果您希望跟踪通过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();
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks); ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } try { latch.await(); } catch (InterruptedException E) { // handle }
,你的任务中
(在尝试/最后附上)latch.countDown();
或者在您调用shutdown()的ExecutorService上,然后在awa itTermination()
ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } taskExecutor.shutdown(); try { taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { ... }
也看看THIS答案
除非我误解了我的理解,否则这两种解决方案都不能解决OP的基本问题,即避免主要阻塞线。 – Trevor 2014-06-22 12:41:14
- 1. 如何知道ExecutorService中的所有线程何时完成?
- 2. c# - 线程池完成时通知,不阻塞主线程
- 3. ExecutorService超时而不会阻塞主线程
- 4. 等到子线程完成但不阻塞主线程
- 5. 等待线程完成而不阻塞UI线程
- 6. Smartthreadpool如何知道所有线程何时完成?
- 7. 线程完成时通知主线程
- 8. 知道线程何时完成
- 9. 如何阻止主线程,直到所有其他线程完成执行?
- 10. 如何启动不阻塞Java主线程的后台线程?
- 11. 知道所有线程何时完成并处理异常
- 12. 阻塞线程上是否存在ExecutorService?
- 13. 如何知道线程已完成
- 14. 如何阻塞和通知线程
- 15. 如何让主线程等待所有子线程完成?
- 16. 如何知道所有线程池的线程是否已完成其任务?
- 17. .NET - 阻塞主线程,直到有任何可用线程
- 18. Nacl_IO阻塞线程,直到fopen完成
- 19. 做的ExecutorService和CountDownLatch阻止主线程,直到他们完成?
- 20. 队列阻塞主线程
- 21. MaxDegreeOfParallelism阻塞主线程?
- 22. NSTask阻塞主线程
- 23. NSoperationQueue阻塞主线程
- 24. 如何生成表单并且不阻塞主线程?
- 25. 如何知道java方法阻塞当前线程
- 26. 当主线程被阻塞时,UIActivityIndicatorView如何不停止?
- 27. 斯卡拉 - 多线程,当任何子线程完成时完成主线程
- 28. 更新GMSMarkers没有阻塞主线程
- 29. 如何知道线程中的工作何时完成?
- 30. 我如何知道多线程何时完成(Swift)
你的主线程做的,它不能被阻止什么? – EJP 2012-03-20 00:42:58
你使用什么UI工具包? – Dev 2012-03-20 00:44:12