线程池的七大参数分析

这是7个参数的JDK源码:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
    if (corePoolSize < 0 ||
        maximumPoolSize <= 0 ||
        maximumPoolSize < corePoolSize ||
        keepAliveTime < 0)
        throw new IllegalArgumentException();
    if (workQueue == null || threadFactory == null || handler == null)
        throw new NullPointerException();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}

大家可能看了还是有点懵,我来说一个生活中的例子吧~
比如大家去银行办理业务,银行有办理业务的窗口(有限个),还有提供的座位(让来办理业务的客户等待休息的位置有限个),它的这个办理业务的窗口并不是什么时候都全部开放的,还有的情况就是办理业务的窗口和让客户休息的位置全满了的情况,就会触发最后一个参数的拒绝策略。

来看这段测试代码,加深理解:

import java.util.concurrent.*;

public class Test1 {
    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(
                2, //核心线程池的大小
                5, //最大核心线程池的大小
                3, //超时时间(释放)
                TimeUnit.SECONDS,//超时时间的单位
                new LinkedBlockingDeque<>(3),//阻塞队列
                Executors.defaultThreadFactory(),//创建线程的工厂
//                new ThreadPoolExecutor.AbortPolicy() //拒绝策略 满了不接待 //java.util.concurrent.RejectedExecutionException:抛出异常
//                new ThreadPoolExecutor.CallerRunsPolicy()// main ok 让ta回去 哪来的去哪 不会抛出异常
//                new ThreadPoolExecutor.DiscardPolicy() //队列满了 不抛出异常 但是ta会把任务丢掉
                new ThreadPoolExecutor.DiscardOldestPolicy()//队列满了 ta会尝试和最早的竞争 (仅仅是尝试)也没有异常
                );
        try {
            for (int i = 0; i < 100; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" ok ");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}

关于拒绝策略的深入,大家可以研究下源码:
在这里插入图片描述

原创文章 38 获赞 52 访问量 4528

猜你喜欢

转载自blog.csdn.net/qq_43612538/article/details/105664615
今日推荐