工作线程发出应该启动正常关闭的最佳方式是什么?
我有一个固定大小的线程池,它通过一组连续的任务工作,每个任务持续不超过几秒钟.在正常操作期间,这种方法很好,并且随着工作量的增加而突出.
我遇到的问题是在其中一个线程中抛出异常.如果发生这种情况,我想把整个事情搞砸,并且无法使其正常工作.
目前的做法我一直使用的天真方法是在"Supervisor"类中使用静态方法,该方法使用标准shutdown()
和awaitTermination()
方法关闭线程池.如果遇到问题,则由任何"Worker"类调用它.这是完成而不是传播异常,因为execute()
需要a Runnable
并且run()
方法不能抛出异常.
这是一些伪代码:
// Finds work to do and passes them on to workers class Supervisor { ThreadPoolExecutor exec; static main() { exec = new FixedThreadPool(...); forever { exec.execute(new Worker(next available task)); } } static stopThreadPool() { exec.shutdown(); if(!exec.awaitTermination(timeout_value)) { print "Timed out waiting on terminate" } } } class Worker { run() { try { // Work goes here } catch () { Supervisor.stopThreadPool() } } }
我看到的效果是线程暂停了一段时间,但后来我看到了超时消息,他们都恢复了处理.这种模式一直持续到我手动关闭它为止.如果我stopThreadPool()
在断开循环后调用main方法,则按预期正确关闭.
这种方法显然是错误的,因为它不起作用,但它也感觉设计不对.
重申一个问题:工作线程发出应该启动正常关闭的最佳方式是什么?
附加信息我在SO上看过的问题有两种:
"我如何杀死线程池中的线程?"
"我怎么知道我的所有线程都已完成?"
那不是我追求的.他们似乎也只谈论一组有限的任务,而我正在处理连续的饲料.
我已经阅读了有关使用exec.submit()
和Future
s 的替代方法,它将责任放在主管类上以检查一切是否正常,但我不知道它是否知道它是否是更好的设计.例外情况是,例外情况,所以我不想在不必要的情况下为正常情况添加工作/复杂性.
(次要注意:这是一个工作项目,还有其他人参与.为了简单,我在问题中说"我".)