【Java 技术指南】「技术盲区」看看线程池是如何回收和维持运作线程的核心技术体系

☕【Java技术指南】「技术盲区」看看线程池是如何回收和维持运作线程的核心技术体系

线程池的难点和重点

让我们一起来看看线程池是如何回收和维持运作线程的核心技术体系。

线程池的前提和介绍

一般来讲 JDK 线程池就是 ThreadPoolExecutor,大多数会对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,我之前的文章也介绍过了相关的技术点分析和介绍说明。

讲一讲线程池是如何回收线程的?

runWorker(Worker w)

复制代码

线程执行的基本流程

  1. 工作线程启动后,就进入 runWorker(Worker w) 方法。

  2. 内部是一个 while 循环,循环判断任务是否为空,若不为空,执行任务;

  3. 若取不到任务,或发生异常,退出循环,执行**processWorkerExit(w, completedAbruptly); **在这个方法里把工作线程移除掉。

读取任务的方式

主要有两种方式:一个是 firstTask,这个是工作线程第一次跑的时候执行的任务,最多只能执行一次,后面得从 getTask 方法里取任务。

getTask 是关键,在不考虑异常的场景下,返回,就表示退出循环,结束线程。

private Runnable getTask() {
          boolean timedOut = false; // Did the last poll() time out?        for (;;) {
              int c = ctl.get();            // Check if queue empty only if necessary.            if (runStateAtLeast(c, SHUTDOWN)                && (runStateAtLeast(c, STOP) || workQueue.isEmpty())) {
                  decrementWorkerCount();                return null;            }            int wc = workerCountOf(c);            // Are workers subject to culling?            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;            if ((wc > maximumPoolSize || (timed && timedOut))                && (wc > 1 || workQueue.isEmpty())) {
                  if (compareAndDecrementWorkerCount(c))                    return null;                continue;            }            try {
                  Runnable r = timed ?                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :                    workQueue.take();                if (r != null)                    return r;                timedOut = true;            } catch (InterruptedException retry) {
                  timedOut = false;            }        }    }

复制代码

重点关注的是 getTask 返回操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值