【问题标题】:when do we consider a worker thread as free in Executor Service我们什么时候认为 Executor Service 中的工作线程是空闲的
【发布时间】:2015-01-29 19:39:38
【问题描述】:

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

提前致谢!!

【问题讨论】:

  • “我们是否认为工作线程一开始提交任务就空闲”为什么我们要这样定义?
  • 一个工作线程在它能够工作时被认为是“空闲的”(即它当前没有执行任务)。
  • 所有工作线程都是天生免费的! ;-)
  • 还有一点,在 ScheduledExecutorService 的情况下,任务重复运行(根据其定义的频率)。任何空闲的工作人员都可以在任何迭代中选择这个计划任务。不是吗?

标签: java multithreading executorservice


【解决方案1】:

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

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

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

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)
    }
 }

因此,如您所见,只有当队列中没有任务时,worker 才会空闲。工作人员要么轮询任务 (1) 的队列,要么执行任务 (2)。

【讨论】:

    【解决方案2】:

    一个工作线程在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
          }
       }
    }
    

    所以回答你的问题,一个特定的工作线程在不执行提交给服务的任务时是空闲的。

    【讨论】:

    • 好吧..这意味着工作人员从将任务从队列中取出到任务完成其运行方法所花费的时间一直很忙..我说得对吗?
    • 是的,没错。需要注意的是,如果队列中没有元素,那么它将等待一个元素存在,您的“从队列中获取任务的时间”的 sn-p 可以省略。所以更正确的说法是——线程从队列中取出任务到运行方法完成的这段时间一直很忙。
    • 还有一个问题,在 ScheduledExecutorService 的情况下,任务重复运行(根据其定义的频率)。任何空闲的工作人员都可以在任何迭代中选择这个计划任务。不是吗?我的意思是说,一旦一个任务被安排在它的第一次迭代中,它未来的迭代就可以在那个时间由任何空闲的工作人员提供服务?
    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 2010-11-08
    • 2014-11-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多