线程池

此文参考博客编写.

1.什么是线程池

线程池就是若干个线程的集合,这些线程被池化了,能够执行多个任务.而并非只为执行一次任务而创建,也并非执行完任务就销毁.

2.线程池的实现原理

上述提到的若干个线程,我们称之为工作线程. 一个线程池中通常有个定量的阻塞队列queue与其配合使用,当外部向一个线程池提交一个任务时,线程池会将这个任务放置到queue中,而线程池中的工作线程会不断向queue中取出任务执行.执行完之后如果发现queue不为空,则继续取,如果queue已经为空, 工作线程们进入waiting状态. 待queue再次不会空,这些线程会被唤醒.从而进行下一次任务的执行.大概原理就是这样

3.线程池如何使用

看看JDK为我们提供的ThreadPoolExecutor.
我们可通过ThreadPoolExecutor来创建一个线程池.再调用其execute方法,传入我们的任务Runable对象即可.

  1. 参数
  • int corePoolSize
    基本工作线程数量
  • int maximumPoolSize
    最大工作线程数量
  • long keepAliveTime
    默认全部工作线程除去基本工作线程的线程空闲时间.也可设置为所有线程的空闲时间. 一旦空闲时间超过了设定值,工作线程将被销毁.
  • TimeUnit unit
    描述上个参数的单位.
  • BlockingQueue<Runnable> workQueue
    存放任务的阻塞队列
  • ThreadFactory threadFactory
    作用是根据任务Runable对象来生产工作线程中的线程. 比如可以对生成的线程设置名字等属性.
  • RejectedExecutionHandler handler
    如果任务Runable对象被拒绝了,将会调用
    handler.rejectedExecution(Runnable r, ThreadPoolExecutor executor)
    你可以抛出异常或者选择死亡
  1. 工作流程


    流程图

    看完上述对参数比较口语化的描述.我们用他们来模拟一个ThreadPoolExecutor当执行execute方法是怎么干的
    首先我们需要用一个Set<Worker>表示当前我们持有的工作线程.

  • 如果set的size比corePoolSize小,那就证明还没有达到基本数量. 这个时候新建一个工作线程Worker来执行Runable对象并将Worker放入set.
  • 如果set的size已经比corePoolSize大.那这个时候把Runable对象放入构造函数传进来的BlockingQueue. 注意.此时调用的不是put方法,也不是add方法,是offer方法. offer方法特点就是如果队列已满就返回false.不等待也不抛异常,很老实.. 如果放入成功,后续就会有工作线程来取走这个Runable对象.
放入Queue
  • 如果放入失败了. 那么判断set的size是不是比maximumPoolSize 小. 如果小,新建一个工作线程Worker来执行Runable对象.并将Worker放入set.
  • 如果大,这个时候拒绝执行Runable对象. 调用构造函数传入的RejectedExecutionHandler.rejectedExecution();
  1. ThreadPoolExecutor状态
状态流转图
  • RUNNING
    初始状态,接受新任务并且处理已经在队列中的任务。
  • SHUTDOWN
    不接受新任务,但处理队列中的任务。
  • STOP
    不接受新任务,不处理排队的任务,并中断正在进行的任务。
  • TIDYING
    所有任务已终止,workerCount为零,线程转换到状态TIDYING,这时回调terminate()方法。
  • TERMINATED
    终态,terminated()执行完成。

4.线程池的意义

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

推荐阅读更多精彩内容