书接上回,在addWorker 方法中,添加成功后会启动 Worker 中的线程
1 | ini复制代码w = new Worker(firstTask); |
接下来看看run方法做了啥
1 | csharp复制代码public void run() { |
runWorker
1 | ini复制代码final void runWorker(Worker w) { |
启动线程的方法还是挺简单的。
processWorkerExit
1 | scss复制代码private void processWorkerExit(Worker w, boolean completedAbruptly) { |
shutdown
1 | scss复制代码public void shutdown() { |
interruptIdleWorkers中断空闲线程
1 | java复制代码private void interruptIdleWorkers(boolean onlyOne) { |
tryTerminate
1 | scss复制代码final void tryTerminate() { |
shutdownNow
1 | scss复制代码public List<Runnable> shutdownNow() { |
shutdownNow关闭线程池流程:
- 把线程池状态改为 STOP ,相当于把所有从 runWorker 进来的口子给拦住了,因为在runWorker中有如下判断:
1 | less复制代码if ((runStateAtLeast(ctl.get(), STOP) || |
如果有线程在关闭线程池的时候,还在task.run();中执行业务代码,当线程被中断后,再次获取任务的时候会抛出异常,举个例子:
被中断的线程再次运行到queue.take();的时候直接抛出异常
1 | scss复制代码public static void main(String[] args) { |
- 中断所有已经启动的现场
1 | scss复制代码interruptWorkers(); |
- 获取所有未执行的任务
1 | ini复制代码tasks = drainQueue(); |
- 更改线程池状态
1 | scss复制代码tryTerminate() |
本文转载自: 掘金