ExecutorService 详解

ThreadPoolExecutor

主要参数:

  • corePoolSize

线程池核心大小,当从没有任务到新任务进入时线程从0上涨到coreSize

  • maximumPoolSize

线程池queue满后新建线程到maxSize为止

  • keepAliveTime

线程无工作后开始计时,如果时间大于keepAliveTime并且总线程数大于coreSize则被回收

  • BlockingQueue<Runnable> workQueue

工作队列,由用户自定义,不同的QUEUE代表了不同的处理方式

  • ThreadFactory

线程工厂,一般用默认的

  • RejectedExecutionHandler

当队列满,线程池满后的异常状况处理,默认抛rejectexecutionException

核心代码:

image.png

中间这步比较特殊,是当前工作线程为空,但是还有任务在队列中则新建一个线程。

常用:

FixedThreadPool

特点

  • corePoolSize=maximumPoolSize
  • 使用LinkedBlockingQueue 无界,缓冲队列
  • 无等待(idel)时间,如果队列为空立即返回
  • 数目固定的线程池,当到达coresize后不会销毁,一直等待

使用问题:

固定的线程数,无界的Queue,当有大量任务时,queue过长可能导致oom

CachedThreadPool

特点

  • 最小线程数0,最大线程数Integer.MAX
  • 使用SynchronousQueue 无界 无缓冲 等待队列
  • 元素添加后必须等待其被取出才能继续放入(可以认为缓存值为1的阻塞队列)
  • 当某个线程60秒未被使用则移除,(图一中workQueue.poll等待60秒,超时返回null,则图2中的循环退出,相应worker结束

使用问题:

当前面线程没有结束时,会一直创建新线程一直到Integer.MAX,然后queue进入等待,
一般会直接导致线程不够用
线程池伸缩会很厉害,极限范围0—Integer.MAX
适用于快速失败的情况

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、多线程 说明下线程的状态 java中的线程一共有 5 种状态。 NEW:这种情况指的是,通过 New 关键字创...
    Java旅行者阅读 4,751评论 0 44
  • 作者:肥肥鱼链接:https://www.zhihu.com/question/30804052/answer/4...
    TTTqiu阅读 978评论 0 4
  • 前段时间遇到这样一个问题,有人问微信朋友圈的上传图片的功能怎么做才能让用户的等待时间较短,比如说一下上传9张图片,...
    加油码农阅读 1,218评论 0 2
  • 当比你优秀的人比你还努力的时候(2)影响圈积极行动比积极思考还要高一个维度,思考积极的人不一定会付诸于行动,而且有...
    随唐演绎阅读 274评论 0 0
  • 1、列表 数组:元素数据类型必须一致列表:不要求数据类型一致,可以是整型、浮点型,也可以是字符串等 1.1、创建列...
    焰火青春阅读 162评论 0 0