1.先说说这个线程池的几个参数
一共六个参数
corePoolSize第一个参数 是核心线程数,也是活跃的线程数,可以执行的最小线程数。
maximumPoolISize第二个参数 是最大的可执行的线程数,也就是线程池最大的线程数。
keepaliveTime第三个参数是一个数字代表 空闲线程的存活时间
TimeUnitunit第四个参数代表 第三个参数的单位
workQueue第五个参数代表 缓存阻塞线程的队列
handler第六个表示 workQueue满了并且maximumpoolSize达到了最大值。线程池拒绝添加新的线程任务的策略逻辑。
理解添加线程的过程:当运行的线程数大于等于corePoolSize时,新进来的线程首先被添加到阻塞队列中去,而不是去创建新的线程。然后当阻塞队列满了后才去创建新的线程,当创建的线程超过了maximumPoolSize 就会拒绝新的线程,然后就是handler来处理被拒绝的线程。
例子:
public class TestPool implements Runnable{
@Override
public void run() {
try {
Thread.sleep(300);//为了达到
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class ThreadExPool {
public static void main(String[] args) {
//线程池允许阻塞的队列大小为6
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(6);
//5代表核心线程数
ThreadPoolExecutor tpool = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, queue);
for(int i=0 ; i<16; i++){
tpool.execute(new TestPool());
System.out.println("活跃数:"+tpool.getPoolSize());
if(queue.size() > 0){
System.out.println("阻塞数:"+queue.size());
}
}
}
}
运行结果:
活跃数:1
活跃数:2
活跃数:3
活跃数:4
活跃数:5
活跃数:5
阻塞数:1
活跃数:5
阻塞数:2
活跃数:5
阻塞数:3
活跃数:5
阻塞数:4
活跃数:5
阻塞数:5
活跃数:5
阻塞数:6
活跃数:6
阻塞数:6
活跃数:7
阻塞数:6
活跃数:8
阻塞数:6
活跃数:9
阻塞数:6
活跃数:10
阻塞数:6
从运行的结果可以看出来,当运行的线程数大于等于5后就开始往阻塞队列中添加新进来的线程,当阻塞队列满了后才开始创建新的活跃线程数。