• 线程池的4种拒绝策略


    new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,new ThreadPoolExecutor.AbortPolicy())

    1.ThreadPoolExecutor.AbortPolicy

    线程池的默认拒绝策略为AbortPolicy,即丢弃任务并抛出RejectedExecutionException异常(即后面提交的请求不会放入队列也不会直接消费并抛出异常);

    2.ThreadPoolExecutor.DiscardPolicy

    丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃(也不会抛出任何异常,任务直接就丢弃了)。

    3.ThreadPoolExecutor.DiscardOldestPolicy

    丢弃队列最前面的任务,然后重新提交被拒绝的任务(丢弃掉了队列最前的任务,并不抛出异常,直接丢弃了)。

    4.ThreadPoolExecutor.CallerRunsPolicy

    由调用线程处理该任务(不会丢弃任务,最后所有的任务都执行了,并不会抛出异常)

    使用最好使用默认的拒绝策略。

    测试代码:

    public class MainTest {
        public static void main(String[] args) {
            //核心线程数
            int corePoolSize = 3;
            //最大线程数
            int maximumPoolSize = 6;
            //超过 corePoolSize 线程数量的线程最大空闲时间
            long keepAliveTime = 2;
            //以秒为时间单位
            TimeUnit unit = TimeUnit.SECONDS;
            //创建工作队列,用于存放提交的等待执行任务
            BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(2);
            ThreadPoolExecutor threadPoolExecutor = null;
            try {
    
                //Executors.
                //创建线程池
                threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,
                        maximumPoolSize,
                        keepAliveTime,
                        unit,
                        workQueue,
                        new ThreadPoolExecutor.CallerRunsPolicy());
    
                //循环提交任务
                for (int i = 0; i < 12; i++) {
                    //提交任务的索引
                    final int index = (i + 1);
                    threadPoolExecutor.submit(() -> {
                        //线程打印输出
                        System.out.println("大家好,我是线程:" + index);
                        try {
                            //模拟线程执行时间,10s
                            Thread.sleep(10000);
                            
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    });
                    //每个任务提交后休眠500ms再提交下一个任务,用于保证提交顺序
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                threadPoolExecutor.shutdown();
            }
        }
    
    }
    

      

  • 相关阅读:
    深入探讨 Python 的 import 机制:实现远程导入模块
    PEP8中文版 -- Python编码风格指南
    【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>
    【转】Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)
    Python字典的json格式化处理(换行与不换行)
    最详细的CentOS 6与7对比(三):性能测试对比
    最详细的CentOS 6与7对比(二):服务管理对比
    WEBAPI 自动生成帮助文档
    MEF IOC使用
    MVC分页示例
  • 原文地址:https://www.cnblogs.com/e-x-c-e-ption/p/14532608.html
Copyright © 2020-2023  润新知