Mir*_*rko 8 java executorservice java.util.concurrent
我正在运行一个高度并发的Java程序.虽然许多线程正在向执行程序服务提交任务,但在某个点上主线程会调用ExecutorService.shutdownNow().
在这个动作之后,我希望:
Thread.currentThread().isInterrupted()由于我处于以下情况:
ExecutorService.shutdownNow(),但没有关闭,即ExecutorService.awaitTermination(long, TimeUnit)永远不会返回trueBlockingQueue.take()ExecutorService.shutdownNow(),挂起线程死于InterruptedException上BlockingQueue.take()我想在调用之前这些线程已经收到BlockingQueue.take()了中断,并且忽略了InterruptedException.
我也想知道是否ExecutorService.shutdownNow()是线程安全的,即,即使线程池正在接收许多提交,它也能正常工作.
总而言之,我有两个问题:
ExecutorService.shutdownNow()不是线程安全的?有没有其他场景可以解释我的情况?
您的线程代码中必须有某些内容正在重置中断标志或吞咽InterruptedException另一个方法调用抛出的异常。
如果在执行到达该BlockingQueue.take()方法之前设置了中断标志,该方法仍然会抛出异常InterruptedException并中止。下面的代码演示了这一点,该代码立即退出并打印“Interrupted!”:
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();
Run Code Online (Sandbox Code Playgroud)
ExecutorService.shutdownNow() 是否可能不是线程安全的?
例如,请参阅:ThreadPoolExecutor 线程安全吗?。根据该答案,所有标准实现ExecutorService都是线程安全的(即使 Javadoc 在该主题上没有明确说明)。
| 归档时间: |
|
| 查看次数: |
2068 次 |
| 最近记录: |