JAVA-ThreadPoolExecutor 为什么在recheck过程中需要在execute函数中判断worker个数?

标签 java threadpoolexecutor

我明白,当我们添加新任务时,我们需要重新检查TPE是否正在运行,但我的问题是为什么我们需要判断workerCountOf(recheck)是否等于0?我的理解是,如果复查期间TPE正在运行,则任务将保证由TPE执行。所以我认为检查是否还有剩余线程来执行任务是TPE的责任,而不是提交者的责任!

我说得对吗?

代码如下:

public void execute(Runnable command) {
    if (command == null)
        throw new NullPointerException();
    int c = ctl.get();
    if (workerCountOf(c) < corePoolSize) {
        if (addWorker(command, true))
            return;
        c = ctl.get();
    }
    if (isRunning(c) && workQueue.offer(command)) {
        int recheck = ctl.get();
        if (! isRunning(recheck) && remove(command))
            reject(command);
        else if (workerCountOf(recheck) == 0) // ????
            addWorker(null, false);
    }
    else if (!addWorker(command, false))
        reject(command);
}

最佳答案

这是一个例子,

假设corePoolSize = 1。第一次检查时,只有一个worker。 之间if (workerCountOf(c) < corePoolSize)workQueue.offer(command) ,唯一的worker完成了它的工作,并且在 block 队列中找不到工作,因此它存在。复查时,workerCountOf(recheck) == 0发生。我们需要启动一个新的工作人员。

CorePoolSize并不总是等于实际的worker数量。每个 worker 都可能在完成工作后死亡,并且在有限的时间内在阻塞队列中找不到工作。

关于JAVA-ThreadPoolExecutor 为什么在recheck过程中需要在execute函数中判断worker个数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46901095/

相关文章:

java - mongodb 2.6+中的批量操作可以用作缓冲区/队列吗?

java - java.util.regex 引擎中奇怪的正向先行行为

java - 在不影响 gui 其余部分的情况下运行后台作业

Java固定线程池等待线程上下文切换

java - Spring的ThreadPoolTask​​Executor的池大小问题

java - executorservice 以 block 的形式从数据库中读取数据并在其上运行进程

java - ExecutorService "happens-before"中的 awaitTermination 是否在其后执行任何代码?

java - java中如何访问其他类方法中的变量

java - 将属性文件构建到 WAR 文件的顶层,Spring-MVC/Maven

java - 如何停止下一个线程在 ScheduledThreadPoolExecutor 中运行