多线程之线程池

创建线程会产生系统开销,并且每个线程会占用一定的内存等资源,同时线程的销毁也需要带来一定的压力。过多的线程还会带来由于上下文切换等等的性能损耗。

使用线程池的好处:
1)提高响应速度:通过复用线程可以消除线程创建销毁带来的延迟,提示响应速度
2)降低资源消耗线程池可以统筹内存和CPU的使用,避免资源使用不当,线程池会根据配置和任务数量灵活控制线程数量,不够就创建,多了就回收,避免线程过多导致内存溢出,过少导致资源浪费
3)提高线程可管理行线程池可以统一管理资源,统一进行分配、调优、监控。

一、线程池参数

1.1 线程池核心参数

1)corePoolSize
核心线程数。默认情况核心线程会一直存活。

2)maxPoolSize
最大线程数。决定线程池最多可以创建多少个线程

3)KeepAliveTime+时间单位
设置线程空闲时间,当线程空闲时间超过KeepAliveTime就会被销毁。allowCoreThreadTimeOut 参数可以决定核心线程若空闲时间过长,是否可以被回收

4)ThreadFactory
线程工厂。用来创建新线程,可以对线程的属性进行定制,比如线程group、线程名称、优先级等。

5)workQueue
存放任务的队列,即缓冲队列。

6)Handler
任务被拒绝时的策略
拒绝时机:

  • 调用shutdown等方法关闭线程池后,此时如果再向线程池提交任务,则遭到拒绝
  • 线程池没有能力处理任务时,即线程数达到了maxPoolSize,切workQueue已满

1.2 线程池拒绝策略

拒绝策略统一实现java.util.concurrent.RejectedExecutionHandler
java在ThreadPoolExecutor中提供了其4中实现:

  • AbortPolicy 当需要拒接任务时,直接抛出RejectedExecutionException运行时异常
  • DiscardPolicy 当需要拒绝任务时直接丢弃,也不会给任何通知,可能会造成数据丢失
  • DiscardOldestPolicy 当需要拒绝任务时,丢弃任务队列中最长时间未被执行的任务,同样存在数据丢失风险
  • CallerRunsPolicy 当需要拒绝任务时,则将此任务交给提交该任务的线程去执行。不会造成数据丢失,而且当线程池满负载时,新来的任务由提交任务的线程去执行,这样主线程因为执行任务而被占用,也就减缓了提交新任务的速度,而线程池也可再次期间执掉一部分任务,腾出空间,相当于给了线程池一个缓冲期,并且相当于有一个负向反馈。

1.3 线程池常用阻塞队列

  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • SynchronizedQueue
    内部没有缓冲区
  • DelayedWorkQueue

三、线程池运行过程

QQ图片20201118223433.png

四、 常见线程池

4.1 FixedThreadPool

固定线程数,无界队列,由于无界队列,会OOM。适用于任务数量不均匀、对内存压力不敏感场景。

4.2 CachedThreadPool

由于maximumPoolSize为Integer,MAX_VALUE,所以最终创建的线程数量会达到操作系统的上限或者导致内存不足。适用于要求低延迟的短期任务场景

4.3 ScheduledThreadPool

适用于定时任务执行场景,支持固定频率和固定延时

4.4 SingleThreadExecutor

单线程线程池,适用于需要一部执行但需要保证任务顺序的场景

  • SingleThreadScheduledExecutor

  • ForkJoinPool
    采用分治思想,将大任务分解成多个小任务处理,然后合并结果

//TODO ForkJoinPool 需要重点关注

五、线程池异常捕获机制

总而言之,使用execute方法提交任务时,异常可以通过线程的UncaughtExceptionHandler机制捕捉异常。
而通过submit方式则不会,因为submit方法会将传入的runnable封装为future,而future内部执行时,直接进行了try catch,因而异常不会被抛出去,因为线程池也就感知不到异常。

https://www.cnblogs.com/ncy1/articles/11629933.html

7.4 线程数量应该设置为多少

CPU密集型任务设置为CPU核心数的1~2倍
IO密集型任务公式:CPU核心数*(1+平均等待时间(I/O)/平均工作时间(cpu计算))

7.5 线程池线程复用原理

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

推荐阅读更多精彩内容