По моему пониманию ThreadpoolExecutor имеет две основные структуры данных (рабочие, workQueue) для управления task.worker (Set) имеет потоки, которые будут работать до завершения работы исполнителя, а workerQueue сохраняет все задачи, выполняемые исполнителем , Но в соответствии с кодом я не вижу, что все задачи добавляются в workQueue.task добавляется в очередь только в строке № 1361, которая не будет выполняться в каждом случае.Назначение работников и workQueue в threadpoolexecutor
ответ
Фактически нет, 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 шага к этому коду:
- Проверьте, если исполнитель может добавить работника. Если он может использовать новый рабочий
- Если нет, попробуйте добавить его в
workQueue
- Если все остальное терпит неудачу, отвергают
по делу, касающемуся ваш вопрос является первым шагом, в котором код возвращается перед добавлением чего-либо. На самом деле, это не так, конструктор для Worker
имеет runnable параметр, который является его первой задачей. Всякий раз, когда TPE добавляет нового работника, представленная runnable - это первая задача, выполняемая этим рабочим. Метод #runWorker(Worker)
будет запускать первую задачу, если она найдена, или дождаться, что там будут задачи в вышеупомянутом workQueue
.
Пожалуйста, разместите код. –
@GKR OP ссылается на исходный код jdk – xTrollxDudex