我正在使用 Executor 框架使用线程池(即 newFixedThreadPool)启动多个线程。我使用 threadpool.submit(aThread) 提交要由线程池执行的作业,这工作正常,但是我需要确定所有线程何时完成,以便我可以继续进行其他处理。我研究了使用 Future.get() ,它会阻塞直到线程完成,这里的问题是它会阻塞直到有结果可用。我还考虑了使用连续调用 isTermminate() 方法,然后在发出关闭命令后进行睡眠,以检查所有线程是否已完成,但这对我来说似乎并不整洁。还有另一种更清洁的方法吗?此外,如果任何一个线程中出现异常,我希望能够终止所有其他正在运行的线程,并阻止池中任何排队的线程启动。做到这一点的最佳机制是什么?
期待听到您的回复
TIA
Use ExecutorService#shutdown() http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#shutdown%28%29进而ExecutorService#awaitTermination() http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination%28long,%20java.util.concurrent.TimeUnit%29
例如:
ExecutorService service = Executors.newCachedThreadPool();
service.submit(...);
service.submit(...);
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
// All tasks have now finished
当任务因异常而失败时通知您。您必须提供线程工厂 http://java.sun.com/javase/6/docs/api/java/util/concurrent/ThreadFactory.htmlExecutorService 为它创建的每个线程设置一个“未捕获的异常处理程序”。然后,该异常处理程序可以终止正在运行的任务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)