资讯专栏INFORMATION COLUMN

通俗易懂的Java线程池原理

宋华 / 303人阅读

摘要:前言最近发现很多小伙伴对于线程池的原理不是特别的理解,所以想通过这篇文章来让大家更好的认识线程池的原理,了解到其是如何工作的讲解下面我会将线程池比作一个公司的一个部门,介绍线程池如何工作的,同时介绍其中的一些关键组件和参数。

前言

最近发现很多小伙伴对于Java线程池ThreadPoolExecutor的原理不是特别的理解,所以想通过这篇文章来让大家更好的认识线程池的原理,了解到其是如何工作的?

讲解

下面我会将线程池比作一个公司的一个部门,介绍线程池如何工作的,同时介绍其中的一些关键组件和参数。

ThreadFactory

一天,某家公司由于业务发展需要,准备建立一个新的部门。由于这个部门的业务公司里是没有一个人接触过,准备招聘一批人来干这个活。

但是这个招人肯定会对人才有要求吧,所以就需要HR来把关了,通过HR来控制入职的人员的素质。(这里把员工比作线程,HR比作ThreadFactory,实际上线程是由ThreadFactory创建的)

corePoolSize

既然上面都提到招人了,那当然不可能无限招人,这个岗位是有上限(corePoolSize是核心线程池的大小,而这里是比作核心员工的上限,毕竟核心员工不会随便解雇)。

需要注意,线程池实际工作是会在当前没有空闲的核心线程时,且当前核心线程数没有达到上限corePoolSize时,直接创建一个新的核心线程。

maximumPoolSize

随着工作的开展,核心员工逐渐招满人了。可是偶尔也会出现工作太大,核心员工工作无法按期完成的情况。

于是老板灵机一动,干脆招一批外包吧。就让HR来把关这批外包的素质。

而核心员工数+外包员工数=部门总人数(maximumPoolSize是线程池的大小,这里比作部门总人数)。

这里需要注意,既然都是HR把关的人,也就是说线程都会由ThreadFactory创建的。

keepAliveTime和unit

既然招聘的是外包,那当然有聘期(keepAliveTime指的是线程存活时间,这里比作外包的聘期)了,而且聘期肯定是有时间单位(unit指的是线程存活时间的时间单位)。

workQueue

HR好不容易招满了外包,可是部门的人却发现工作的确是做不完啊,怎么办呢?

只好是把任务排期了(workQueue指的是阻塞队列BlockingQueue对象,这里比作任务排期),如果谁状态好可以从排期的任务中把任务提前做了。

handler

但是部门的人排期后发现,工作实在太多了,排期都排到要天天加班才能搞定。

于是部门的人干脆向领导投诉了,拒绝这么多工作,至于怎么拒绝就得看他们怎么做了(handler指的是拒绝执行处理器RejectedExecutionHandler,只有当线程池每个线程都在工作中,且BlockingQueue达到上限才会触发。)

allowCoreThreadTimeOut

某一天老板想不开,觉得这个部门的员工没必要留,可是部门的业务还有赚钱的。

于是他灵机一动,为什么不整个部门都招外包来干活呢?

于是整个部门都是外包了,工作不忙时就可以很方便的减少人员了。(allowCoreThreadTimeOut是设置核心线程是否允许超时的标志位,默认为false即核心线程不允许超时回收,而设置为true时,核心线程如果在一定时间内keepAliveTime无任务处理就会触发超时回收)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75115.html

相关文章

  • 重拾 Java 基础

    摘要:阿里开始招实习,同学问我要不要去申请阿里的实习,我说不去,个人对阿里的印象不好。记得去年阿里给我发了邮件,我很认真地回复,然后他不理我了。 引言 最近好久没有遇到技术瓶颈了,思考得自然少了,每天都是重复性的工作。 阿里开始招实习,同学问我要不要去申请阿里的实习,我说不去,个人对阿里的印象不好。 记得去年阿里给我发了邮件,我很认真地回复,然后他不理我了。(最起码的尊重都没有,就算我菜你起...

    ideaa 评论0 收藏0
  • 深入剖析ThreadPool运行原理

    摘要:而且,线程池中的线程并没有睡眠,而是进入了自旋状态。普通的线程被中断会导致线程继续执行,从而方法运行完毕,线程退出。线程死亡超过时间,任务对列没有数据而返回。线程死亡保证了线程池至少留下个线程。 线程在执行任务时,正常的情况是这样的: Thread t=new Thread(new Runnable() { @Override ...

    Pines_Cheng 评论0 收藏0
  • Java线程并发编程面试笔录一览

    摘要:创建线程的方式方式一将类声明为的子类。将该线程标记为守护线程或用户线程。其中方法隐含的线程为父线程。恢复线程,已过时。等待该线程销毁终止。更多的使当前线程在锁存器倒计数至零之前一直等待,除非线 知识体系图: showImg(https://segmentfault.com/img/bVbef6v?w=1280&h=960); 1、线程是什么? 线程是进程中独立运行的子任务。 2、创建线...

    bitkylin 评论0 收藏0
  • 通俗易懂,JDK 并发容器总结

    摘要:线程安全的线程安全的,在读多写少的场合性能非常好,远远好于高效的并发队列,使用链表实现。这样带来的好处是在高并发的情况下,你会需要一个全局锁来保证整个平衡树的线程安全。 该文已加入开源项目:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目,Star 数接近 14 k)。地址:https://github.com/Snailclimb... 一 JDK ...

    curlyCheng 评论0 收藏0
  • 【推荐】最新200篇:技术文章整理

    摘要:作为面试官,我是如何甄别应聘者的包装程度语言和等其他语言的对比分析和主从复制的原理详解和持久化的原理是什么面试中经常被问到的持久化与恢复实现故障恢复自动化详解哨兵技术查漏补缺最易错过的技术要点大扫盲意外宕机不难解决,但你真的懂数据恢复吗每秒 作为面试官,我是如何甄别应聘者的包装程度Go语言和Java、python等其他语言的对比分析 Redis和MySQL Redis:主从复制的原理详...

    BicycleWarrior 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<