线程池的创建方式

public class ThreadPoolDemo {
    public static void main(String[] args) {
        //第一中获取的方式
        ExecutorService service = Executors.newFixedThreadPool(10);
        //第二种获取方式
        /**
         * 直接new ThreadPoolExecutor()对象  并且手动指定参数
         * 1 corePoolSize : 线程池的核心线程数量  线程池创建出来就会new  Thread()  5个
         * 2 maxmumPoolSize:最大线程数量  线程池支持最大的线程数
         * 3 keepAliveTime  存活时间  当线程数大于核心线程  空闲的线程的存活时间 8-5=3
         * 4 utils  存活时间单位
         * 5 BlockingQueue<Runnable>  阻塞队列 当线程数超过了核心线程数  那么新的请求到来就会加入到阻塞队列中  下的实现类有很多  LinkedBlockingQueue  的默认构造方法的大小是integer.max的最大值 我们需要手动设定大小
         * 6 ThreadFactory 创建线程的工厂对象
         * 7 RejectedExecutionHandler 当线程数大于最大线程数的时候会执行的淘汰策略
         * 当请求超过LinkedBlockingQueue 的阻塞队列时  就会开启最大线程来 消费阻塞队列中的请求
         * 当队列 满了  最大线程也满了  那么就需要淘汰策略来
         */
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5,
                100,
                10,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(1000),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        poolExecutor.execute(() -> {
            System.out.println("--------->"+Thread.currentThread().getName());
        });
    }
}
当线程池刚创建出来的时候就初始化了5个核心线程数
当请求达到线程池中  
若请求数大于5时 就会将多于的请求放入阻塞队列中
有最大线程数来消化剩余的请求
当请求数超过到阻塞队中的数量 且在设置的时间内没有线程来处理阻塞队列中的请求时  
那么就会执行淘汰策略 拒绝后面的请求到来

比如有一个线程 core :5 max:50 queue:100 如果并发是200 线程池是怎么处理的?
首先 200个中的前面5个被核心线程处理 然后6-105会加入到阻塞队列中 然后106到155的请求
在最大线程数中,那么会创建对应的线程来处理这些请求,之后剩下的45个请求会被直接放弃

 

posted @ 2022-06-07 17:05  花心大萝卜li  阅读(94)  评论(0)    收藏  举报