我正在运行一个高度并发的
Java程序.
虽然许多线程正在向执行程序服务提交任务,但在某个点上主线程调用ExecutorService.shutdownNow().
在这个行动之后,我希望:
>执行程序服务不接受任何其他任务
>执行程序服务的队列清晰
>其余正在运行的工作程序被中断,也就是说,如果他们正确地管理InterruptedException并且/或者显式检查Thread.currentThread(),它们会在某个时刻关闭.isInterrupted()
由于我处于以下情况:
>执行程序服务由于ExecutorService.shutdownNow()而“关闭”,但没有关闭,也就是说,ExecutorService.awaitTermination(long,TimeUnit)永远不会返回true
>我的执行程序服务管理的一些挂起的线程在BlockingQueue.take()上等待
>如果我再次调用ExecutorService.shutdownNow(),则挂起的线程会因BlockingQueue.take()上的InterruptedException而死亡
我想在调用BlockingQueue.take()之前,这些线程已经收到了中断,并且忽略了InterruptedException.
我还想知道ExecutorService.shutdownNow()是否是线程安全的,即,即使线程池正在接收许多提交,它也能正常工作.
总而言之,我有两个问题:
>有没有可以解释我情况的替代方案?
> ExecutorService.shutdownNow()可能不是线程安全的吗?