线程池原理解析一

讲解线程池原理之前,首先了解一下什么是线程池:

        线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到线程池中并等待下一次分配任务。

至于为什么要使用线程池?

        对于操作系统来说,频繁的创建销毁线程会消耗大量的资源。所以可以创建线程池来统一管理这些运行的线程。线程用于在需要执行大量异步任务的情况下,使用线程池减少了每个任务运行的负载。

了解完线程池后,接下来了解它是如何使用的:

        JDK1.5提供了Executor框架,开发者可以使用线程池工厂类Executors根据不同的需求创建各种不同形式的线程池。常用的有以下几种线程池:

        1、newCachedThreadPool:

newCachedThreadPool

        创建一个阻塞队列为SynchronousQueue的线程池。当调用execute方法时,将重用空闲的工作线程。如果没有工作线程可利用,则将创建新的工作线程并添加到线程池。空闲线程超过60s将会被回收。

        2、newFixedThreadPool:

newFixedThreadPool

        创建一个固定数量的工作线程的线程池。如果所有的工作线程在执行任务,新提交的任务将会在任务队列中等待,直到有工作线程可利用。一旦线程空闲下来就会被回收。

        3、newSingleThreadExecutor:

newSingleThreadExecutor

        创建只有一个工作线程的executor。(工作线程在线程池关闭之前,如果执行任务失败,则创建一个新的工作线程来替代旧的工作线程)。

其实大多数线程池的本质都是初始化一个ThreadPoolExecutor对象。

ThreadPoolExecutor构造方法

        corePoolSize:线程池核心线程数。

        keepAliveTime:空闲线程允许的最大空闲时间。

        defaultThreadFactory:用于创建线程的工厂方法。

        maximumPoolSize: 线程池可以容纳的最大线程数。

        workQueue:用于存放任务的阻塞队列,提交的任务需要实现Runnable接口。JDK提供了如下几种阻塞队列:

            1、ArrayBlockingQueue:可以阻止资源的浪费,但在不可估量负载的情况下,可能出现吞吐量下降的情况。

            2、LinkedBlockingQueue:当任务提交的速度大于线程处理任务的速度时,可能出现任务无限制提交的情况。

            3、SynchronousQueue:每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。

            4、PriorityBlockingQueue:插入的元素必须可比较。

        defaultHandler:用于处理被拒绝的任务。当线程数到达最大线程数并且阻塞队列达到饱和,execute方法会调用RejectedExecutionHandler的rejectedExecution处理被拒绝的任务。JDK提供如下几种拒绝策略:

            1、ThreadPoolExecutor.AbortPolicy:默认情况下执行,直接抛出RejectedExecutionException运行时异常。 

            2、CallerRunsPolicy:线程调用execute方法执行任务。这种策略提供了一个反馈机制减慢新任务的提交速度。

            3、DiscardPolicy:直接丢弃新提交的任务 。

            4、DiscardOldestPolicy:如果executor没有关闭,队列头的任务将会被丢弃,然后executor重新尝试执行任务(如果失败,则重复这一过程)。

            5、我们也可以自己定义RejectedExecutionHandler以适应特殊环境的需求。

然后来了解一下线程池状态。

线程池状态定义

        在ThreadPoolExecutor类中有个ctl变量用于显示线程池状态。其中AtomicInteger是一个提供原子操作的Integer类,保证多线程情况下ctl的变化是线程安全的。ctl是个神奇的变量,它的高3位用于显示线程池状态,低29位用于显示线程池中的线程数。

        1、RUNNING:接受新的任务,处理队列任务。

        2、SHUTDOWN:不再接受新的任务,处理队列任务。

        3、STOP:不再接受新任务,不处理队列任务,中断正在执行的任务线程。 

        4、TIDYING:所有的任务已经结束,任务线程为0,线程转换到TIDYING状态。

        5、TERMINATED:线程池已将结束,即terminated()方法执行完。

 随着时间的推移,线程池状态之间也是在发生着转化,以下是几种状态转化的条件。

        1、RUNNING -> SHUTDOWN(调用shudown方法) 

        2、RUNNING或者SHUTDOWN -> STOP(调用shutdown方法)

        3、SHUTDOWN -> TIDYING (当线程池和队列都为空)

        4、STOP -> TIDYING (当线程池为空)

        5、TIDYING -> TERMINATED (terminated方法执行完)

目前先对线程池做个大致的了解,对于如何调用addWorker,runWorker等方法留到下篇再解释。



        本篇文章主要是看到占小狼大神的《深入分析java线程池的实现原理》,然后想有样学样的总结一下线程池原理,同时看了一下线程池几个核心类的源码并且翻译了一下注释,有兴趣的小伙伴可以去看看注释。对于这篇总结,如果哪里写的不对,谢谢批评指正。

参考:https://www.jianshu.com/p/87bff5cc8d8c

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容