线程池七大参数介绍!手写线程池

1.corePoolSize:线程池中的常驻核心线程数。

(1).在创建了线程池后,当有请求任务来了之后,就会安排池中线程去执行请求任务,近似理解为今日当值线程。
(2). 在线程池中的线程数目达到corePoolSize后,就会把后续到达的任务放到缓存队列中。

2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1。

3.keepAliveTime:多余的空闲线程的存活时间。当前线程池数量超过corePoolSize时,当空闲时间到达keepAliveTime值时,多余空闲线程会被销毁直到剩下corePoolSize个线程为止。

(1).默认情况下:只有当线程池中的线程数大于corePoolSize时keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize。

4.unit:keepAliveTime的单位。

5.workQueue:任务队列,被提交但尚未被执行的任务。

6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般默用即可。

7.handler:拒绝策略,表示当dui队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)。

(1).拒绝策略是什么?等待队列也已经满了,再也塞不下新任务了,同时,线程池中的max线程也达到了,无法继续为新任务服务。这时候我们就需要拒绝策略机制合理的处理这个问题。

手写线程池:

public class MyThreadPoolDemo {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());

        ExecutorService threadPool = new ThreadPoolExecutor(
                2, //corePoolSize
                5,//maximumPoolSize
                1L,//keepAliveTime
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

     try
    {
        //模拟10个用户来办理业务,每个用户就是来自外部的请求线程
        for (int i = 1; i <= 10; i++) {

            threadPool.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "\t 办理业务");
            });
        }
    }catch (Exception e){
        e.printStackTrace();
    }finally{
        threadPool.shutdown();
    }
}}

运行结果:当10位用户来办理时,会出现异常。如图:因为最大线程数为5,阻塞队列为3,所以只要大于8个用户同时请求,就会抛出异常
线程池七大参数介绍!手写线程池_第1张图片

你可能感兴趣的:(JavaCode)