在threadpoolexecutor中工人和workQueue的目的

时间:2017-02-03 12:49:16

标签: java multithreading concurrency threadpoolexecutor

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

1 个答案:

答案 0 :(得分:6)

实际上没有,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. 如果其他所有方法都失败了,请拒绝
  4. 关于您的问题的案例是第一步,代码在添加任何内容之前返回。事实上,情况并非如此,Worker的构造函数有一个runnable参数,这是它的第一个任务。每当TPE添加一个新工作程序时,提交的runnable就是该工作程序中运行的第一个任务。如果找到第一个任务,#runWorker(Worker)方法将运行第一个任务,或等待上述workQueue中的任务。