根据我的理解,ThreadpoolExecutor有两个主要的数据结构(workers,workQueue),用于管理tasks.worker(Set),线程将一直运行到执行器关闭,而workerQueue将所有任务保存到executor。但是,根据我没有看到的代码,在workQueue.task中添加了所有的任务,只在第1361行中添加了任务,而在每种情况下都不会执行这些任务。
发布于 2017-02-03 15:17:38
实际上没有,workQueue实际上并没有保存提交给执行器的所有任务。这里是#execute(Runnable)的主要部分(使用这作为参考,您可能使用的是蕨类植物解压缩源或其他版本);
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);这段代码有三个步骤:
workQueue中。与您的问题有关的情况是第一步,在这一步中,代码在添加任何内容之前返回。事实上,情况并非如此,Worker的构造函数有一个runnable参数,这是它的第一个任务。每当TPE添加一个新的工作人员时,可运行的提交是在该工作人员中运行的第一个任务。如果找到第一个任务,#runWorker(Worker)方法将运行它,或者等待前面提到的workQueue中有任务。
https://stackoverflow.com/questions/42024723
复制相似问题