线程池中的线程何时死亡?

本文产生的原因

面试被问到了, 结果说的不清楚。 回来查看了源码,总结了一下。

结论

查看从workQueue中getTask , 当非core线程空闲时间超过keepAliveTime, timeUnit指定的时间后,则退出

(ps:超过空闲时间退出这个我是知道的,但是当时本能的认为不是问的这个,哭。。)

普通线程(Thread)什么时候结束?

要明白线程池的线程什么时候结束,我们要明确普通一个线程(不在线程池中)什么时候结束?废话,当然是Thread#run完毕后,就结束。

线程池里的线程什么时候结束?

什么,还有人不清楚线程池?那我就按提交一个任务的逻辑,简单介绍一下吧。
如果已经熟悉线程池,可以跳过这部分内容,直接查看关键1:runWorker方法关键2:什么情况下getTask返回空

线程池中提交任务

threadPoolExecutor.execute(runnable);

threadPoolExecutor#execute(runnable)

可以看到当线程数少于核心数,core=true,表示需要新建线程。

在这里插入图片描述

addWorker(firstTask)

在这里插入图片描述

线程状态new: newWorker(command)->getThreadFactory().newThread(this)

在这里插入图片描述

线程状态runnable:worker.thread.start()

回到addWorker的过程中,注意这里t.start()启动了 worker中的线程。
在这里插入图片描述

线程状态running:worker.thread.start()->run()->runWorker();

Worker是Runnable的实现类, 内部含有Thread
执行Worker实现的run()->runWorker(this)方法。
当执行完**runWorker(this)**方法,线程也就自动走向了死亡。
在这里插入图片描述

关键1:runWorker方法

addWorker()#start()->runwWorker(this)

可见,线程在循环中 一直利用getTask方法workQueue中取出threadPoolExecutor.execute(runnable)runnable
task不为空,就task.run执行任务。
当getTask返回为null则退出循环。然后结束该线程
在这里插入图片描述

关键2:什么情况下getTask返回空

线程启动期间 runWorker() ,循环getTask后run。
当getTask为空,则退出循环,结束线程。
因此,什么时候返回null是关键。
下图可见,当线程池关闭(这里暂不细究),或者 获取任务超时都会导致返回null.
在这里插入图片描述

其他介绍

线程状态

NEW: new Thread()后
RUNNABLE: thread.start()后
RUNNING: CPU调度到该线程的时候。一旦CPU放弃调度后或yield后,该线程成RUNNABLE
BLOCK: ,阻塞的IO操作,获取锁的时候加入到锁的阻塞队列,
WAITTING:sleep, wait后加入waitSet,join,selector的wakeup
TERMINALTED: 线程终止。

ctl

一个AtomicInteger,低28位用来表示线程数,高4位用来表示线程池状态。

The main pool control state, ctl, is an atomic integer packing
two conceptual fields
workerCount, indicating the effective number of threads
runState, indicating whether running, shutting down etc
在这里插入图片描述

线程池

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, timeUnit, workQueue,Executors.defaultThreadFactory(), defaultHandler);

execute提交任务时:
  1. 当execute时,线程小于corePoolSize,则addWorker(firstTask,true)创建新线程。
  2. 当线程数量 大于核心数量corePoolSize后,则将任务入队。
  3. workQueue到达最大数量时,继续创建线程直到线程数量大于maximumPoolSize
  4. 当线程数量大于maximumPoolSize后,执行拒绝策略defaultHandler
  5. TERMINALTED:当非core线程空闲时间(getTask)超过keepAliveTime, timeUnit指定的时间后,则退出。
  6. threadPoolExecutor允许核心线程退出,类似于5.
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值