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

本文产生的原因

面试被问到了, 结果说的不清楚。

回来看了下。

结论

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

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

Thread

当Thread#run完毕后,就结束。

线程状态

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

线程池中提交任务

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)**方法,线程也就自动走向了死亡。
在这里插入图片描述

runWorker(this)

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

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

getTask()

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

其他介绍

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.
发布了116 篇原创文章 · 获赞 44 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/thewindkee/article/details/98180782