线程池的工作流程

线程池中参数最全的构造方法有7个参数
在这里插入图片描述当一个任务(runnable)被添加时
一、判断当前线程数量是否达到核心线程最大值(corePoolSize),若当前线程数<corePoolSize ,则创建核心线程执行任务。若当前线程数>corePoolSize,则尝试进入阻塞队列BlockingQueue
二、判断队列是否已满,若未满,则进入队列等待,若已满,则尝试创建非核心线程。
三、线程总数最大值(maximumPoolSize)=核心线程最大值(corePoolSize)+非核心线程最大值。线程池未满,则可以创建非核心线程。
四、若线程池已满,则由处理器(handler) 抛出异常。

五、几经波折任务终于进入线程池,并被完成了。经过非核心线程闲置存活时间(keepAliveTime) 后,非核心线程被销毁。作为一个人为设定值,它的计量单位(TimeUnit unit) 可以从微秒、毫秒到小时、天。
六、还有个未提到的threadFactory(线程工厂),用来创建线程。给线程起个名,通过Thread.currentThread().getName(),我们可以获取当前运行线程的名称。还可以改变线程的名称、线程组、优先级、守护进程状态,一般采用默认。
在这里插入图片描述
在以上运行流程中,7个参数都由发挥的空间,但实际上创建一个线程池最少只需要5个参数就足够了,线程工厂和处理器是可以没有的。
在这里插入图片描述 后来被提交的任务,在队列已满时,直接创建非核心线程,并被完成了。而先来的任务,因为核心线程已满,队列未满,乖乖排队。这看起来像是插队行为,常用的ArrayBlockingQueue就是上述所说的队列。但不同的队列也有不同的排队规则。
常用的workQueue有
ArrayBlockingQueue

SynchronousQueue(无存储空间阻塞队列)这个队列接收到任务的时候,会直接提交给线程处理,而不保留它。使用这个类型队列的时候,maximumPoolSize一般指定成Integer.MAX_VALUE,即无限大

LinkedBlockingQueue(无界阻塞队列) 如果当前线程数小于核心线程数,则新建核心线程,如果当前线程数等于核心线程数,则进入队列等待。这个队列没有最大值限制,总线程数永远不会超过corePoolSize。

DelayQueue是一个没有边界BlockingQueue实现,加入其中的元素必需实现Delayed接口。这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务。也就是说,队列中元素的顺序是按到期时间排序的,而非它们进入队列的顺序。

事实上,在线程空闲时,即使核心线程,也可以被回收
allowCoreThreadTimeOut设置为true时,允许线程数低于corePoolSize,则核心线程被回收。
以上就是一个任务进入线程池并被完成结束的全部流程了。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值