2017-02-03 15 views
1

По моему пониманию ThreadpoolExecutor имеет две основные структуры данных (рабочие, workQueue) для управления task.worker (Set) имеет потоки, которые будут работать до завершения работы исполнителя, а workerQueue сохраняет все задачи, выполняемые исполнителем , Но в соответствии с кодом я не вижу, что все задачи добавляются в workQueue.task добавляется в очередь только в строке № 1361, которая не будет выполняться в каждом случае.Назначение работников и workQueue в threadpoolexecutor

+1

Пожалуйста, разместите код. –

+1

@GKR OP ссылается на исходный код jdk – xTrollxDudex

ответ

5

Фактически нет, 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 шага к этому коду:

  1. Проверьте, если исполнитель может добавить работника. Если он может использовать новый рабочий
  2. Если нет, попробуйте добавить его в workQueue
  3. Если все остальное терпит неудачу, отвергают

по делу, касающемуся ваш вопрос является первым шагом, в котором код возвращается перед добавлением чего-либо. На самом деле, это не так, конструктор для Worker имеет runnable параметр, который является его первой задачей. Всякий раз, когда TPE добавляет нового работника, представленная runnable - это первая задача, выполняемая этим рабочим. Метод #runWorker(Worker) будет запускать первую задачу, если она найдена, или дождаться, что там будут задачи в вышеупомянутом workQueue.