首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程池执行器中的工作人员和workQueue的用途

线程池执行器中的工作人员和workQueue的用途
EN

Stack Overflow用户
提问于 2017-02-03 12:49:16
回答 1查看 1.6K关注 0票数 2

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

EN

回答 1

Stack Overflow用户

发布于 2017-02-03 15:17:38

实际上没有,workQueue实际上并没有保存提交给执行器的所有任务。这里是#execute(Runnable)的主要部分(使用作为参考,您可能使用的是蕨类植物解压缩源或其他版本);

代码语言:javascript
复制
 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);

这段代码有三个步骤:

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42024723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档