【问题标题】:Purpose of workers and workQueue in threadpoolexecutorthreadpoolexecutor中workers和workQueue的用途
【发布时间】:2017-06-20 20:28:15
【问题描述】:

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

【问题讨论】:

  • 请贴一些代码。
  • @GKR OP 指的是jdk源码

标签: java multithreading concurrency threadpoolexecutor


【解决方案1】:

实际上没有,workQueue 实际上并没有保留所有提交给执行者的任务。这是#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. 检查执行器是否可以添加工作人员。如果可以,请使用新的工人
  2. 如果没有,请尝试将其添加到workQueue
  3. 如果一切都失败了,拒绝

关于您的问题的案例是第一步,代码在添加任何内容之前返回。事实上,并非如此,Worker 的构造函数有一个可运行参数,这是它的第一个任务。每当 TPE 添加新的工作人员时,提交的可运行文件就是在该工作人员中运行的第一个任务。 #runWorker(Worker)方法找到第一个任务就会运行,或者等待前面提到的workQueue中有任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 2015-07-29
    • 2017-12-06
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多