Java并发编程,关于那些厉害得不得了的线程池...

本文编辑于 2018/10/23 不可能侵权,所以不删

ReStartLin


前言

众所周知,在java的后端开发中,少不了和线程打交道,但同时线程的创建和销毁也是很耗费资源的,那么如何提高并发的效率呢? 为了解决这个问题,java就给我们带来了concurrent并发包

前言的前言

既然说到并发,那么中点内容就是线程池了,但是线程池的底层实现又依赖于队列,队列才是对任务进行分发执行的核心...
说到队列,粗略地列表一下就是以下几种:

1.ArrayDeque, (数组双端队列) 
2.PriorityQueue, (优先级队列) 
3.ConcurrentLinkedQueue, (基于链表的并发队列) 
4.DelayQueue, (延期阻塞队列)(阻塞队列实现了BlockingQueue接口) 
5.ArrayBlockingQueue, (基于数组的并发阻塞队列) 
6.LinkedBlockingQueue, (基于链表的FIFO阻塞队列) 
7.LinkedBlockingDeque, (基于链表的FIFO双端阻塞队列) 
8.PriorityBlockingQueue, (带优先级的无界阻塞队列) 
9.SynchronousQueue (并发同步阻塞队列)

还挺多,具体看业务场景选择使用即可.深入了解还需要查找相关内容

线程池

前言说完就说说我们的主角线程池了...
线程池的目的在于:

1、降低资源的消耗,通过重复利用已创建的线程降低线程创建和销毁所造成的消耗
2、提高相应速度
3、提高线程的可管理性

java也给我们便利地带来了对应的实现操作类.

Executor框架
CachedThreadPool:创建一个可缓存线程池,如果线程池的长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
FixedThreadPool 创建一个定长线程池, 可控制线程最大并发数,超出的线程会在队列中等待
ScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务的执行
SingleThreadExecutor 创建一个单线程化的线程池,他只会用唯一的工作线程来执行任务,保证所有的任务按照指定顺序FIFO LIFO优先级 等 执行

有趣的是,这几个线程池的最顶层实现其实是构造函数的参数不同而已...

Executor 框架的最顶层实现是ThreadPoolExecutor类 Executors工厂类中提供的

ThreadPoolExecutor

这里说说ThreadPoolExecutor构造函数中常用的5个参数,其他还请自行查询资料.

ThreadPoolExecutor(int corePoolSize,
                   int maximumPoolSize,
                   long keepAliveTime,
                   TimeUnit unit,
                   BlockingQueue<Runnable> workQueue) 

一个一个来说明:
corePoolSize:核心线程数,顾名思义 就是线程池中重中之重的线程的数目,被归类在核心线程池中的线程即使没有在使用,也不会被销毁. 当然如果你想它也被销毁复用的话,,,那就设置allowCoreThreadTimeOuttrue
maximumPoolSize:线程池所能容纳的最大线程数。超过这个数的线程将被阻塞。需要注意的是:任务队列为没有设置大小的---LinkedBlockingDeque时,这个值无效。因为LinkedBlockingDeque不设置大小默认是无限大的...所以装都装不完,就不会触发这个参数了.
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止,配合TimeUnit来使用.
unit:参数 keepAliveTime 的时间单位,有七种取值,在TimeUnit类中有七种静态属性
workQueue:顾名思义是任务队列,取值类型参考上文.

最后一个参数没啥好说的,主要是前面四个参数是配合使用的.

keepAliveTimeunit是用来指定线程在空闲多久时间之后会被销毁用的,那么配合其他的参数一起会是怎么样的呢,,举个例子:

有这么一间工厂,靠生产谋生(这好像是废话_)/. 这家工厂一创立就用了10个员工,假设这家工厂实行永久雇佣制,那么这就是所谓的corePoolSize核心线程了.
继续假设每个员工每次只能着手完成一个任务,那么任务的来源就是流水线了. 那么这条流水线上能放多少个任务呢?这就是靠工作队列workQueue所指定的长度来决定的,下文假设是20;
今天是个好日子,厂里开张得到了20个订单,准备着手生产.
10个员工马不停蹄地领走了10个订单进行生产,剩下的10个订单就只能留在流水线上等待被执行了.

时间流失,又有那么一天,但是这天却很糟糕,厂里不小心接到了50个订单,,,我的天
10个员工拿走10个订单,流水线上放着20个订单,,,,那还剩20个订单进不去呀,,这可怎么办 这样会造成工厂崩溃的
老板灵机一动:拿钱(消耗资源)去请临时员工!! 就这样请来了20个临时员工(线程),这样就解决了燃眉之急了2333

往后几天工作量又平稳了下来,10个员工足以胜任,不能白养着临时员工呀,开掉. 这个临时员工存在的时长呢,就是keepAliveTimeunit

故事说到这里,想必你们都捋清楚了吧, 核心线程就是核心员工,不会被开除(回收),那么maximumPoolSize最大线程数指的就是核心员工加临时员工的数目了,如果任务总量超过了这个值,就会造成系统崩溃的(throws exception).

举个栗子:

ThreadPoolExecutor(1,2,10l,TimeUnit.SECONDE,new LinkedBlockingDeque<String>(5)); 

极限状态下,任务开始执行,核心线程取走1个任务,队列存放5个任务,临时线程为2-1一个,临时创建执行一个任务,那么最大能同时容纳``1+5+1```个任务,超过这个数目就会报错了,,指定临时线程在空闲 10s之后就会被销毁

关于线程数的设置

核心线程数与最大线程数相同.
考虑I/O密集型任务和CPU密集型任务,这两者具体是什么需要查阅相关资料
一般来说,,
CPU密集型任务 一般设置线程数为:CPU核心数或者CPU核心数+1
I/O密集型任务 一般设置线程数为:2* cpu的核数

如果有误,请斧正

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

推荐阅读更多精彩内容

  • 从阴影中跃下一个黑影。熊大春定睛一看,是一只歪脖子老猴,天黑看不起皮毛的颜色,只见坐在熊大春头顶的树杈上,翘起二郎...
    枢姚阅读 400评论 0 0
  • 其实现在有这么多关于中医的讨论,是一个挺好的现象,说明中医还一直在公众视野中,并且有很大一群人对于中医很有信心。中...
    一只碧老板阅读 621评论 0 1
  • 奶奶的身体不算硬朗,腰间盘突出压迫神经至使行动不太方便!只能满满的挪行…… 今天吃过早饭,来到奶奶家,坐在沙发...
    玥光下的猫阅读 149评论 0 0