面试官: 线程池是如何做到线程复用的?有了解过吗,说说看

本文探讨了ThreadPoolExecutor如何实现线程复用。通过addWorker()方法,线程池将线程封装为Worker并放入工作线程组。Worker在完成任务后并不销毁,而是继续从阻塞队列中获取新任务执行。使用take()和poll()方法在核心线程和非核心线程间平衡资源消耗,实现线程的有效复用。理解这一机制对于深入掌握Java线程池至关重要。
摘要由CSDN通过智能技术生成

承接上节的问题,我们继续探讨ThreadPoolExecutor,一起来看下吧~

ThreadPoolExecutor中是如何做到线程复用的❓

我们知道,一个线程在创建的时候会指定一个线程任务,当执行完这个线程任务之后,线程自动销毁。但是线程池却可以复用线程,一个线程执行完线程任务后不销毁,继续执行另外的线程任务。那么它是如何做到的❓这得从addWorker()说起

addWorker()

  • 先看上半部分addWorker()
private boolean addWorker(Runnable firstTask, boolean core) {
    retry:
    for (;;) {
        int c = ctl.get();
        int rs = runStateOf(c);

        // 对边界设定的检查
        if (rs >= SHUTDOWN &&
            ! (rs == SHUTDOWN &&
                firstTask == null &&
                ! workQueue.isEmpty()))
            return false;

        for (;;) {
            int wc = workerCountOf(c);
            if (wc >= CAPACITY ||
                wc >= (core ? corePoolSize : maximumPoolSize))
                return false;
            if (compareAndIncrementWorkerCount(c))
                break retry;
            c = ctl.get();  // Re-read ctl
            if (runStateOf(c) != rs)
                continue retry;
            // else CAS failed due to workerCount change; retry inner loop
        }
}

retry:可能有些同学没用过,它只是一个标记,它的下一个标记就是for循环,在for循环里面调用continue/break再紧接着retry标记时,就表示从这个地方开始执行continue/break操作,但这不是我们关注的重点。

从上面的代码,我们可以看出,ThreadPoolExecutor在创建线程时,会将线程封装成工作线程worker,并放入工作线程组中,然后这个worker反复从阻塞队列中拿任务去执行。这个addWorkerexcute方法中调用的

  • 我们接着看下半部分
private boolean addWorker(Runnable firstTask, boolean core) {
        // 上半部分
        retry:
        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN &&
                ! (rs == SHUTDOWN &&
                   firstTask == null &&
                   ! workQueue.isEmpty()))
                return false;

            for (;;) {
                int wc = workerCountOf(c);
                // core
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值