ExecutorService.shutdownNow()不会关闭线程

Mir*_*rko 8 java executorservice java.util.concurrent

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

在这个动作之后,我希望:

  1. 执行程序服务不接受任何其他任务
  2. 执行程序服务的队列是清楚的
  3. 其余正在运行的工作程序被中断,也就是说,如果他们正确管理InterruptedException和/或明确检查,他们会在某一时刻关闭 Thread.currentThread().isInterrupted()

由于我处于以下情况:

  1. 执行程序服务由于a而"关闭" ExecutorService.shutdownNow(),但没有关闭,即ExecutorService.awaitTermination(long, TimeUnit)永远不会返回true
  2. 有一些挂起的线程由我的执行器服务管理等待a BlockingQueue.take()
  3. 如果我再次调用ExecutorService.shutdownNow(),挂起线程死于InterruptedExceptionBlockingQueue.take()

我想在调用之前这些线程已经收到BlockingQueue.take()了中断,并且忽略了InterruptedException.

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

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

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

Dun*_*nes 4

有没有其他场景可以解释我的情况?

您的线程代码中必须有某些内容正在重置中断标志或吞咽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 在该主题上没有明确说明)。