问题描述
一个work线程如果取不到任务,应该不会停止吧,应该变为空闲状态了是吗,代码里面是如果控制的呢,threadPoolexector代码里面是如何实现的能把一个线程弄成空闲状态啊,然后有任务过来还要把线程唤醒,我就是不知道代码里面是如何做到的,麻烦大家指点
解决方案
是通过BlockingQueue来实现的。开JDK源代码可以看到,ThreadPoolExecutor里定义了这么一个任务队列:private final BlockingQueue<Runnable> workQueue;所有的Worker线程的run方法里就是循环的从这个队列里取任务出来处理。而ThreadPoolExecutor的execute方法则会往这个队列里添加任务。任务其实就是待执行的Runnable对象。BlockingQueue的特性就是如果队列是空的话,所有从队列里取东西的线程都会被阻塞,直到有新东西入队或者被中断为止。所以,当没有任务的时候,所有的Worker线程都会阻塞在workQueue上,等待execute方法插入新的任务来唤醒。当队列满了的时候,所有向队列里塞东西的线程也都会被阻塞,直到队列腾出新的空位或者被中断为止。所以,当workQueue满了的时候,执行execute的线程也会被阻塞,等待Worker线程处理workQueue里的任务。BlockingQueue的具体信息:http://download.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html
时间: 2024-10-01 18:12:14