gpt4 book ai didi

java - threadpoolexecutor 中 worker 和 workQueue 的用途

转载 作者:行者123 更新时间:2023-12-04 05:44:55 25 4
gpt4 key购买 nike

根据我的理解,ThreadpoolExecutor 有两个主要的数据结构(workers,workQueue)用于管理任务。worker(Set)有线程将一直运行直到执行程序关闭,而 workerQueue 使所有任务都进入执行程序。但是根据代码,我没有看到所有任务都被添加到 workQueue 中。任务仅在第 1361 行添加到队列中,不会在每种情况下都执行。

最佳答案

其实没有,workQueue其实并没有保留所有提交给executor的任务。这是 #execute(Runnable) 的主要部分(使用 this 作为引用,您可能正在使用 fernflower 反编译源或其他版本或其他);

 1323           int c = ctl.get();
1324 if (workerCountOf(c) < corePoolSize) {
1325 if (addWorker(command, true))
1326 return;
1327 c = ctl.get();
1328 }
1329 if (isRunning(c) && workQueue.offer(command)) {
1330 int recheck = ctl.get();
1331 if (! isRunning(recheck) && remove(command))
1332 reject(command);
1333 else if (workerCountOf(recheck) == 0)
1334 addWorker(null, false);
1335 }
1336 else if (!addWorker(command, false))
1337 reject(command);

此代码有 3 个步骤:

  1. 检查执行者是否可以添加 worker 。如果可以,请使用新的 worker
  2. 如果没有,尝试将其添加到workQueue
  3. 如果一切都失败了,拒绝

关于您的问题的案例是第一步,代码在添加任何内容之前返回。其实不是这样的,Worker的构造函数有一个runnable参数,这是它的第一个任务。每当 TPE 添加一个新的 worker 时,提交的 runnable 是该 worker 中运行的第一个任务。 #runWorker(Worker) 方法将在找到第一个任务时运行,或者等待上述 workQueue 中有任务。

关于java - threadpoolexecutor 中 worker 和 workQueue 的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42024723/

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