线程池之我理解


四种常用线程池

构造方式:静态工厂方法

public static ExecutorService newSingleThreadExecutor()

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)

public static ExecutorService newCachedThreadPool()

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

说明图



执行示意图

我们可以看出,线程池中的corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收,maximumPoolSize就是线程池中可以容纳的最大线程的数量,而keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,而util,就是计算这个时间的一个单位,workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。threadFactory,就是创建线程的线程工厂,最后一个handler,是一种拒绝策略,我们可以在任务满了知乎,拒绝执行某些任务。


执行流程

任务进来时,首先执行判断,判断核心线程是否处于空闲状态,如果不是,核心线程就先就执行任务,如果核心线程已满,则判断任务队列是否有地方存放该任务,若果有,就将任务保存在任务队列中,等待执行,如果满了,在判断最大可容纳的线程数,如果没有超出这个数量,就开创非核心线程执行任务,如果超出了,就调用handler实现拒绝策略。

handler的拒绝策略:

有四种:第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满

第二种DisCardPolicy:不执行新任务,也不抛出异常

第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行

第四种CallerRunsPolicy:直接调用execute来执行当前任务


个人理解

1、线程池默认使用threadFactory已经创建好线程,当然也可以自己实现factory方法。

2、关注下四种创建线程的队列,比如:

SynchronousQueue--阻塞队列;LinkedBlockingQueue--链表阻塞队列。




参考:

深入理解线程和线程池(图文详解) - weixin_40271838的博客 - CSDN博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 序言 近日后台需要一些数据,需要从网上爬取,但是爬取的过程中,由于访问速度太频繁,造成IP被封,最终通过线程池解决...
    非专业程序员阅读 4,355评论 0 3
  • 前段时间遇到这样一个问题,有人问微信朋友圈的上传图片的功能怎么做才能让用户的等待时间较短,比如说一下上传9张图片,...
    加油码农阅读 4,965评论 0 2
  • 目前的工作是接触大数据相关的内容,自己也缺少高并发的知识,刚好前几天看了flume的源码,里面也用到了各种线程池内...
    等一夏_81f7阅读 5,385评论 0 0
  • 饭后“一不要”,睡前“二不要”,肝脏好得不得了! 现在,肝病已经成为中国最普遍的疾病之一了,脂肪肝、酒精肝、肝硬化...
    七色花园阅读 3,153评论 0 0
  • 那么我会拿起这把枪狩猎这个城市的青春 扣动扳机 打出一发子弹 子弹定格了那一刻的美好记忆 时间流逝 唯有中枪的猎物...
    谜小涵阅读 1,414评论 0 0

友情链接更多精彩内容