我在理解执行器服务的固定线程池的工作时遇到了概念问题。
假设我有一个由 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
}
}
}
因此,为了回答您的问题,当特定工作线程未执行提交到服务的任务时,它是空闲的。
嗯,这很简单...让我们开始吧。
- 线程池执行任务。提交给它的任务存储在队列中。
- 任务实现
runnable
接口,因此它有一个不带任何参数并返回 void 的 run 方法。此方法充当入口点或由线程池中的"将执行任务的线程"调用的方法。 - 现在,回到线程池:一个。内部队列的线程池妥协可能是
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)。