gpt4 book ai didi

java - ExecutorService.shutdownNow() 不关闭线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:40 29 4
gpt4 key购买 nike

我正在运行一个高度并发的 Java 程序。当许多线程向执行程序服务提交任务时,主线程会在某个时刻调用 ExecutorService.shutdownNow()

执行此操作后,我希望:

  1. 执行者服务不会接受额外的任务
  2. 执行者服务的队列清晰
  3. 其余运行的 worker 被中断,也就是说,如果他们正确管理 InterruptedException 和/或显式检查 Thread.currentThread().isInterrupted()

由于我处于以下情况:

  1. 执行程序服务由于 ExecutorService.shutdownNow() 而“关闭”,但并未关闭,即 ExecutorService.awaitTermination(long, TimeUnit) 从不返回 true
  2. 有一些由我的执行程序服务管理的待处理线程正在等待 BlockingQueue.take()
  3. 如果我再次调用 ExecutorService.shutdownNow(),挂起的线程会因 BlockingQueue.take() 上的 InterruptedException 而死

我想中断是在调用 BlockingQueue.take() 之前被那些线程接收到的,InterruptedException 被忽略了。

我还想知道 ExecutorService.shutdownNow() 是否是线程安全的,也就是说,即使线程池正在接收许多提交,它也能正常工作。

总而言之,我有两个问题:

  1. 是否有任何替代方案可以解释我的情况?
  2. 有没有可能 ExecutorService.shutdownNow() 不是线程安全的?

最佳答案

Is there any alternative scenario that would explain my situation?

您的线程代码中一定有某些东西正在重置中断标志或吞下另一个方法调用抛出的 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();

Is it possible that ExecutorService.shutdownNow() is not thread safe?

参见,例如:Is ThreadPoolExecutor thread safe? .根据该答案,ExecutorService 的所有标准实现都是线程安全的(即使 Javadoc 并未明确说明该主题)。

关于java - ExecutorService.shutdownNow() 不关闭线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24327711/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com