我们何时将工作线程视为执行程序服务中的空闲线程



我在理解执行器服务的固定线程池的工作时遇到了概念问题。
假设我有一个由 n 个线程组成的固定池线程,并且我正在向此服务提交多个任务。现在,如果工作线程可用,它将执行提交的任务,其他提交的任务在队列中等待,直到工作线程空闲。
我的问题是,我们什么时候将工人视为自由工作线程?
无论任务是否完成,我们是否认为工作线程在启动提交的任务时立即空闲,或者只要提交的任务正在进行,我们就认为工作线程很忙。
假设池中有一个工作线程 W1,并且将任务 Op1 提交给执行程序。
W1 在时间 T1 启动 Op1,一段时间后,Op1 在时间 T3 完成执行。这里 T3> T1
现在,我们是认为 W1 在时间 T1 启动 Op1 后立即空闲,还是认为它很忙,并且在时间 T3 是空闲的。

提前感谢!!

工作线程在从队列中takes时是空闲的。 任何给定的工作线程在不再运行任务时都会从队列中取出。所以它看起来像

private final BlockingQueue<Runnable> workQueue;
class WorkerThread {
   public void run(){
      while(true){
        Runnable r = workQueue.take(); // worker thread is 'free'
        r.run(); // worker thread is busy
      }
   }
}

因此,为了回答您的问题,当特定工作线程未执行提交到服务的任务时,它是空闲的。

嗯,这很简单...让我们开始吧。

  1. 线程池执行任务。提交给它的任务存储在队列中。
  2. 任务实现runnable接口,因此它有一个不带任何参数并返回 void 的 run 方法。此方法充当入口点或由线程池中的"将执行任务的线程"调用的方法。
  3. 现在,回到线程池:一个。内部队列的线程池妥协可能是ArrayBlockingQueue/LinkedBlockingQueue,等等......重点是:它始终是一个队列。b.持续轮询此队列的一组线程。

执行任务的线程看起来像这样

void run() {
    while (true) {
        //Get the task from the thread pool internal queue (1)      
        //Call the run method of the task. 
        //If the execution of the task throws a Runtime exception - catch it and display it. (2)
    }
 }

因此,如您所见,仅当队列中没有任务时,工作人员才会空闲。工作线程要么轮询队列以查找任务 (1),要么执行任务 (2)。

相关内容

  • 没有找到相关文章

最新更新