• 线程池的四种拒绝策略


    一、首先我们要知道什么是拒绝策略:

            线程池中,有三个重要的参数,决定影响了拒绝策略:corePoolSize - 核心线程数,也即最小的线程数。workQueue - 阻塞队列 。 maximumPoolSize - 最大线程数。
    当提交任务数大于 corePoolSize 的时候,会优先将任务放到 workQueue 阻塞队列中。当阻塞队列饱和后,会扩充线程池中线程数,直到达到 maximumPoolSize 最大线程数配置。此时,再多余的任务,则会触发线程池的拒绝策略了。总结起来,也就是一句话,当提交的任务数大于(workQueue.size() + maximumPoolSize ),就会触发线程池的拒绝策略。

    二、然后我们要了解线程池的拒绝策略都有哪四种:        

      策略    处理方式
     AbortPolicy直接抛出异常
    DiscardPolicy  丢弃当前被拒绝的任务(不抛出异常)
    DiscardOldestPolicy将工作队列中最早的任务丢弃,去执行新的任务
    CallerRunsPolicy交给调用线程池的线程处理

                       

                  

                          
     

    二、下面用代码给大家进一步演示一下

    1. AbortPolicy

    1. public static void main(String[] args) throws Exception{
    2. int corePoolSize = 5;
    3. int maximumPoolSize = 10;
    4. long keepAliveTime = 5;
    5. BlockingQueue workQueue = new LinkedBlockingQueue(10);
    6. RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardOldestPolicy();
    7. ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, handler);
    8. for(int i=0; i<100; i++) {
    9. try {
    10. executor.execute(new Thread(() -> log.info(Thread.currentThread().getName() + " is running")));
    11. } catch (Exception e) {
    12. log.error(e.getMessage(),e);
    13. }
    14. }
    15. executor.shutdown();
    16. }

    2. DiscardPolicy  

    主体相同,更换拒绝策略

    RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();

    3. DiscardOldestPolicy

    主体相同,更换拒绝策略

    RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();

    4. CallerRunsPolicy

    主体相同,更换拒绝策略

    RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardOldestPolicy();

    以上是线程池的四种拒绝策略.

  • 相关阅读:
    我的这段代码为什么总是报错“”is not in list,怎么改呢?
    【Java8新特性】- Lambda表达式
    F5 iRule示例综合展示
    web前端大作业:诗人文化网页主题网站【唐代诗人】纯HTML+CSS制作
    一级缓存(默认开始sqlsession级别)和 二级缓存(testTwoCache)
    基于simulink的Active anti-islanding-AFD主动反孤岛模型仿真
    《Python3 网络爬虫开发实战》urllib 初体验
    golang GC
    小程序canvas 2d支持同层渲染,绘制环形进度条
    NFV中:DPDK与SR-IOV应用场景及性能对比
  • 原文地址:https://blog.csdn.net/ylimhsjyn/article/details/126460716