美文网首页
线程池-3

线程池-3

作者: 01010100 | 来源:发表于2018-04-20 11:29 被阅读12次

再来进一步看看

addWorker最主要的工作就是w = new Worker(firstTask) 即新开线程。

具体分为两部分,第一部分检验线程池的状态和增加工作线程数

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);

                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 toworkerCount change; retry inner loop

           }

       }

分析:①这里单独看起来比较难以理解

if (rs >= SHUTDOWN &&  

                ! (rs == SHUTDOWN &&

                   firstTask == null &&

                   ! workQueue.isEmpty()))

                return false;    //新增线程失败

先反过来理解:将不符合return

false的条件(也就是继续往下执行即符合新增线程的条件)拆分一下:

一、rs < SHUTDOWN,好理解即线程池状态为RUNNING

二、(rs ==

SHUTDOWN && firstTask == null && ! workQueue.isEmpty()),怎么理解呢?

这需要结合上面execute方法,当线程池中工作线程数为空,addWorker(null,

false)新开一个任务为空的线程,不是为了执行新任务,而是只是为了执行队列中的任务,这就好理解多了。如上的条件即翻译成:线程池为 SHUTDOWN时,任务为空且队列不为空时,需要继续往下执行。场景就是:当线程池为SHUTDOWN时,不再接受新任务,但还需要继续执行队列中已添加的任务。

这时候再顺过来,突然发现也很好理解

一、rs > SHUTDOWN线程池为STOP、TIDYING、TERMINATED,直接return false

二、rs == SHUTDOWN线程池为SHUTDOWN时:

1、firstTask != null 即新增的任务 ==》return false(不接受新任务)

2、workQueue.isEmpty()即任务队列为空(==》return false(队列中没有需要执行的任务了)

addWorker的第二部分的源码相对简单,主要就是:

w = new Worker(firstTask);

t.start();

若start失败,则addWorkerFailed()

start()启动调用的就是当前Worker的run

->runWorker(),run又继续调用当前Worker的runWorker方法。

相关文章

  • 线程池学习笔记

    1、线程池的定义 2、Executors创建线程池的方式 3、ThreadPoolExecutor对象 4、线程池...

  • 线程池

    1、为什么要使用线程池2、线程池的工作原理3、线程池参数4、阻塞队列5、饱和策略6、向线程池提交任务7、线程池的状...

  • 线程池

    目录: 1.线程池的作用2.线程池的种类3.线程池的使用 线程池的作用: 线程主要是通过控制执行的线程的数量,超出...

  • 大白话聊聊线程池的工作原理和核心参数

    目录 1、为啥要使用线程池 2、线程池的工作原理 3、线程池都用哪些核心参数 4. 有界队列下的线程池的工作流程 ...

  • 线程池

    1.为什么要使用线程池?2.线程池的基本原理是什么?3.怎么学习线程池?线程池使用了池化技术。池化技术用于我们常见...

  • pthread 创建的动态线程池

    组织结构: 1,缓存工作的任务池,任务节点 2,存储工作线程的池,线程节点 3,任务池投递到工作线程的线程 4,工...

  • ThreadPoolExecutor学习笔记

    线程池状态: 高3位表示"线程池状态"低29位表示"线程池中的任务数量" Worker

  • JDK多任务执行框架

    1、为什么要使用线程池?2、线程池有什么作用?3、说说几种常见的线程池及使用场景。4、线程池都有哪几种工作队列?5...

  • 线程池面试题

    1、为什么要使用线程池?2、线程池有什么作用?3、说说几种常见的线程池及使用场景。4、线程池都有哪几种工作队列?5...

  • 实战! 多线程线程池分析

    一 项目线程池运用 二 线程池代码分析 线程池参数这里面的参数分别为初始线程数3,最大线程数6,线程存活时间0毫秒...

网友评论

      本文标题:线程池-3

      本文链接:https://www.haomeiwen.com/subject/tcyakftx.html