JAVA-ThreadPoolExecutor为什么我们需要在重新检查过程中判断执行函数中的工作计数?

时间:2017-10-24 02:06:22

标签: 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);
}

2 个答案:

答案 0 :(得分:1)

这是一个例子,

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

CorePoolSize并不总是等于工人的实际数量。每项工作在完成工作后都会死亡,并且在有限的时间内没有在区块队列中找到工作。

答案 1 :(得分:0)

但是,即使队列中没有任务,核心线程也永远不会在完成工作后退出