根据阿里java开发手册,使用的创建线程池方法

根据阿里java开发手册,使用的创建线程池方法

阿里java开发手册规定

    3. 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
    说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资
    源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者
    “过度切换”的问题。
    4. 【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样
    的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
    说明: Executors 返回的线程池对象的弊端如下:
    1) FixedThreadPool 和 SingleThreadPool :
    允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求,从而导致 OOM 。
    2) CachedThreadPool 和 ScheduledThreadPool :
    允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建大量的线程,从而导致 OOM 。

总结出的创建线程池方式

    private static final ThreadPoolExecutor EXECUTOR_SERVICE = new ThreadPoolExecutor(5,100,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(100),
        new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()
    ,new ThreadPoolExecutor.CallerRunsPolicy());
    //这里使用的是ThreadPoolExecutor的完整版构造函数
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) 
  • 对各个参数做下说明
参数作用说明
corePoolSize核心线程数量,线程池初始化时设定
maximumPoolSize线程池最大线程数(非核心线程) 核心线程 和 非核心线程 共同使用线程池、但是核心线程是不会被回收的、回收条件是线程池中的线程数量大于核心线程数corePoolSize 大小和 maximumPoolSize 大小一致的话 线程池中的线程将不会空闲、 keepAliveTime 和 timeUnit 就不会再起作用
keepAliveTime如果当前线程池中线程数大于corePoolSize。多余的线程、在等待keepAliveTime时间后如果还没有新的线程任务指派给它、它就会被回收
unit等待时间keepAliveTime的单位
workQueue等待队列默认SynchronousQueue一个没有存储空间的阻塞队列,将任务同步交付给工作线程;可以使用无界队LinkedBlockingQueue;有界队列ArrayBlockingQueue;以及优先级队列PriorityBlockingQueue
RejectedExecutionHandler饱和策略下面对饱和策略有个详细说明
ThreadFactory主要是对我们的线程进行一个命名
  • 对饱和策略做个说明
策略作用说明
AbortPolicy终止策略是默认的饱和策略,当队列满时,会抛出一个RejectExecutionException异常,客户可以捕获这个异常,根据需求编写自己的处理代码没有真正解决问题
DiscardPolicy策略会悄悄抛弃该任务。不建议使用
DiscardOldestPolicy策略将会抛弃下一个将要执行的任务,如果此策略配合优先队列PriorityBlockingQueue,该策略将会抛弃优先级最高的任务不建议使用
CallerRunsPolicy调用者运行策略,该策略不会抛出异常,不会抛弃任务,而是将任务回退给调用者线程执行(调用execute方法的线程),由于任务需要执行一段时间,所以在此期间不能提交任务,从而使工作线程有时间执行正在执行的任务。推荐使用
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值