Java threadpoolexecutor中工作线程和工作队列的用途

Java threadpoolexecutor中工作线程和工作队列的用途,java,multithreading,concurrency,threadpoolexecutor,Java,Multithreading,Concurrency,Threadpoolexecutor,据我所知,ThreadpoolExecutor有两个主要的数据结构(worker,workQueue)用于管理任务。worker(Set)的线程将一直运行,直到executor关闭,workerQueue将所有任务保留给executor。但根据代码,我没有看到所有任务都添加到工作队列中。任务仅添加到队列中的第1361行,不会在任何情况下执行。实际上没有,工作队列实际上并没有保留提交给执行者的所有任务。以下是#execute(Runnable)的主要部分(作为参考,您可能使用fernflower反

据我所知,ThreadpoolExecutor有两个主要的数据结构(worker,workQueue)用于管理任务。worker(Set)的线程将一直运行,直到executor关闭,workerQueue将所有任务保留给executor。但根据代码,我没有看到所有任务都添加到工作队列中。任务仅添加到队列中的第1361行,不会在任何情况下执行。

实际上没有,
工作队列
实际上并没有保留提交给执行者的所有任务。以下是
#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);