Nis*_*hat 2 java concurrency multithreading threadpoolexecutor
根据我的理解,ThreadpoolExecutor有两个用于管理tasks的主要数据结构(worker,workQueue).worker(Set)的线程将一直运行直到执行器关闭,而workerQueue将所有任务都保存到执行程序中.但是根据代码,我没有看到所有任务都被添加到workQueue.task中,只在第1361行添加到队列中,不会在每种情况下都执行.
实际上没有,实际上workQueue并没有将所有任务提交给执行者.这是主要部分#execute(Runnable)(使用此作为参考,您可能正在使用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);
Run Code Online (Sandbox Code Playgroud)
这段代码有3个步骤:
workQueue关于您的问题的案例是第一步,代码在添加任何内容之前返回.事实上,情况并非如此,构造函数Worker有一个runnable参数,这是它的第一个任务.每当TPE添加一个新工作程序时,提交的runnable就是该工作程序中运行的第一个任务.#runWorker(Worker)如果找到了该方法,则该方法将运行第一个任务,或者等待上述任务中的任务workQueue.
| 归档时间: |
|
| 查看次数: |
686 次 |
| 最近记录: |