我正在运行一个高度并发的Java程序。
虽然许多线程正在向执行程序服务提交任务,但在某个点上主线程调用ExecutorService.shutdownNow()
。
在此行动之后,我希望:
Thread.currentThread().isInterrupted()
因为我处于以下情况:
ExecutorService.shutdownNow()
而“关闭”,但未关闭,即ExecutorService.awaitTermination(long, TimeUnit)
永不返回true
BlockingQueue.take()
ExecutorService.shutdownNow()
,则挂起的帖子会在InterruptedException
上BlockingQueue.take()
消失我认为在调用BlockingQueue.take()
之前,这些线程已经收到了中断,并且忽略了InterruptedException。
我也想知道ExecutorService.shutdownNow()
是否是线程安全的,即即使线程池正在接收许多提交,它也能正常工作。
总而言之,我有两个问题:
ExecutorService.shutdownNow()
是否可能是线程安全的?答案 0 :(得分:3)
有没有可以解释我情况的替代方案?
您的线程代码中必定存在重置中断标志或吞下由另一个方法调用引发的InterruptedException
的内容。
如果在执行到达BlockingQueue.take()
方法之前设置了中断标志,则该方法仍将抛出InterruptedException
并中止。这在以下代码中进行了演示,该代码立即退出并打印"中断!":
final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
Thread t = new Thread() {
@Override
public void run() {
Thread.currentThread().interrupt();
try {
queue.take();
} catch (InterruptedException e) {
System.out.println("Interrupted!");
}
};
};
t.start();
ExecutorService.shutdownNow()是否可能是线程安全的?
例如,请参阅:Is ThreadPoolExecutor thread safe?。根据该答案,ExecutorService
的所有标准实现都是线程安全的(即使Javadocs在该主题上不明确)。