线程池的七大参数分析

更新时间:2020-04-23 10:24:17 点击次数:1236次
这是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();
        }
    }
}

关于拒绝策略的深入,大家可以研究下源码:


本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!