java - ThreadPoolExecutor 如何中断空闲线程?

标签 java java.util.concurrent

刚刚翻了一下ThreadPoolExecutor的源码,发现一旦达到keepAliveTime的设定值,allowCoreThreadTimeOut为true,它就会中断所有空闲的worker。

我有点奇怪它只能在 runState >= SHUTDOWN 时调用中断方法:

下面的代码来自ThreadPoolExecutor的方法getTask()

Runnable getTask() {
...
if (workerCanExit()) {
    if (runState >= SHUTDOWN) // Wake up others
        interruptIdleWorkers();
    return null;
   }
}

这是否意味着所有空闲线程只能在 runState >= SHUTDOWN(SHUTDOWN、STOP 或 TERMINATED)时被中断?也就是说,当状态为 RUNNING 时,它们不会被中断。

最佳答案

你是对的。 ThreadPoolExecutor 中的此 getTask() 方法被调用以获取要运行的工作线程的下一个任务。此代码块仅在方法调用未识别任何要执行的 Runnable 任务时执行。因此,如果没有发现要执行的内容,它必须检查关闭状态。

来自 workerCanExit() 的 java 文档

Check whether a worker thread that fails to get a task can exit. We allow a worker thread to die if the pool is stopping, or the queue is empty, or there is at least one thread to handle possibly non-empty queue, even if core timeouts are allowed.

关于java - ThreadPoolExecutor 如何中断空闲线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10384868/

相关文章:

java - 如果语句不能正常工作

java - 防病毒软件正在阻止我的 inno setup 编译的可执行 .exe 文件

java - 加入两个不同的ExecutorService

java - Java 8 中的parallelStream 中产生了多少个线程?

java - ExecutorService.submit(<callable>) 需要更多时间?

java - 如何计算 Math.pow(10, n),其中 n>=10000

java - 给定列表时,如何检查元素是否相等

java - 访问被拒绝 ("java.io.FilePermission" "execute")

java - Java 中的生产者/消费者。为什么我们需要两个条件?

java - double 和 long 的非原子处理