Java threadpoolexecutor中工作线程和工作队列的用途
据我所知,ThreadpoolExecutor有两个主要的数据结构(worker,workQueue)用于管理任务。worker(Set)的线程将一直运行,直到executor关闭,workerQueue将所有任务保留给executor。但根据代码,我没有看到所有任务都添加到工作队列中。任务仅添加到队列中的第1361行,不会在任何情况下执行。实际上没有,Java threadpoolexecutor中工作线程和工作队列的用途,java,multithreading,concurrency,threadpoolexecutor,Java,Multithreading,Concurrency,Threadpoolexecutor,据我所知,ThreadpoolExecutor有两个主要的数据结构(worker,workQueue)用于管理任务。worker(Set)的线程将一直运行,直到executor关闭,workerQueue将所有任务保留给executor。但根据代码,我没有看到所有任务都添加到工作队列中。任务仅添加到队列中的第1361行,不会在任何情况下执行。实际上没有,工作队列实际上并没有保留提交给执行者的所有任务。以下是#execute(Runnable)的主要部分(作为参考,您可能使用fernflower反
工作队列
实际上并没有保留提交给执行者的所有任务。以下是#execute(Runnable)
的主要部分(作为参考,您可能使用fernflower反编译源代码或其他版本或其他任何版本)
1323 int c=ctl.get();
1324 if(工作计数(c)
此代码有3个步骤:
工作队列
与您的问题有关的案例是第一步,在此步骤中,代码在添加任何内容之前返回。事实上,情况并非如此,
Worker
的构造函数有一个runnable参数,这是它的第一个任务。每当TPE添加新的辅助进程时,runnable submitted是该辅助进程中运行的第一个任务。#runWorker(Worker)
方法将运行找到的第一个任务,或者等待前面提到的工作队列中出现任务
请发布一些代码。@GKR OP指的是jdk源代码
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);