码迷,mamicode.com
首页 > 编程语言 > 详细

Java线程池

时间:2020-05-11 15:31:58      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:let   最大   java线程池   空闲   易用   int   直接   OLE   异常   

一.Java提供Executors工具类来创建四种类型的线程池:

1.单线程的线程池:Executors.newSingleThreadExecutor()

技术图片

技术图片

 

2.定长线程池:Executors.newFixedThreadPool(int nThreads)

技术图片

 

3.可缓存的线程池:Executors.newCachedThreadPool(int nThreads)

技术图片

 

4.定期执行的线程池:Executors.newScheduledThreadPool(int corePoolSize)

技术图片

 技术图片

技术图片

 

 

二.ThreadPoolExecutors详解

通过源码可以发现,Exectuors内部其实是通过new ThreadPoolExecutor来创建线程池,而阿里开发手册中规定禁用Execotrs创建线程池,推荐用ThreadPoolExecutors来创建;

那么阿里为什么禁止使用Executors来创建线程池呢,首先来查看ThreadPoolExecutors构造函数的几个参数:

  • int  corePoolSize:线程池核心线程数量,这些线程保持不会被销毁
  • int  maximumPoolSize:线程池最大线程数量,当所需线程数超过核心线程池数量且工作队列中等待任务已满,则会创建新的线程直至到达设置的最大数量
  • long  keepAliveTime:非核心线程的空闲时间
  • TimeUnit  unit:时间单位(时、分、秒等)
  • Queue<E>  queue:用于存放未被执行的任务队列,分为同步队列,有界队列,无界队列,优先队列
  • ThreadFactory  threadFactory:用于创建线程的线程工场,一般用默认即可
  • RejectedExecutionHandler  handler:拒绝策略,当线程数量超出最大线程数量的执行策略

再来看一下线程池的执行过程:

技术图片

 

 

通过参数可以看出来,Executors创建的线程池最大线程数量以及线程队列都是Integer.MAX_VALUE,几乎相当于无限制创建,这样非常容易导致内存溢出;所以创建线程池最好通过自定义的

ThreadPoolExecutors来创建,这样更容易用过具体环境来优化线程池线程数量

 

 三.ThreadPoolExecutors拒绝策略

  1. AbortPolicy:直接抛出异常,阻止系统正常运行
  2. CallerRunPolicy:该策略会把任务队列中的任务放在调用者的线程中运行,如果线程已关闭则会丢弃任务
  3. DiscardOledestPolicy:该策略会丢弃任务队列中最早放入的任务
  4. DiscardPolicy:该策略会丢弃所有被线程池拒绝的任务,不予任何处理

Java线程池

标签:let   最大   java线程池   空闲   易用   int   直接   OLE   异常   

原文地址:https://www.cnblogs.com/ljhblogs/p/12868939.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!