理解ThreadPoolExecutor的笔记

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后就开始往阻塞队列中添加新进来的线程,当阻塞队列满了后才开始创建新的活跃线程数。

猜你喜欢

转载自blog.csdn.net/liaoxiaolin520/article/details/84566208