线程池笔记

ThreadPoolExecutor:

一、主要的成员变量:

  ctl: 主线程池的控制状态,它是一个atomic integer ,包含了两个概念上的域,①、workerCount,线程池中有效线程的数量。②、runState,是否正在运行,关闭等状态。

    工作线程数量(workerCount)就是workers的值(成员变量workers).这个值有可能会与真实存活的线程的数量是不一样,因为这个值是瞬间变化的。比如,当ThreadFactory创建一个线程失败以后;或者存在的线程在终止之前仍然被记录。用户看到的池大小是当前workers的长度。

    为了将这两个值装箱到一个int中,我们限制它的工作线程在2^29之内,也就是500万引内,而不是的Integer.MAX_VALUE(20亿以内)。

    运行状态(runState)提供生命周期的控制,它的值由以下几个常量来表示:RUNNING, SHUTDOWN, STOP, TIDYING, TERMINATED. runState随着时间单调递增,

  workQueue:持有任务线程,并且交给工程线程处理。我们不要求workQueue.poll()必须返回null值来唯一的判断队列是否为空。

  mainLock:持有mainLock的时候才可以访问workers或者与其相关的信息。

  workers:池中所有的工作者线程。只有持有mainLock的时候才可以访问。

  largestPoolSize:用来追踪线程池线程数量最大的时候是多少。

  completedTaskCount:已经完成的任务数量。

  threadFactory:用来创建新的线程。

  keepAliveTime:允许空闲线程等待任务的时间,单位为纳秒。只有在当前线程数量大于核心池的数量或者允许核心池线程超时。其它情况的话会一直等待新的任务。

  corePoolSize:核心池的大小就是保持活动状态不允许超时的的工作者线程的最小值,除非设置了allowCoreThreadTimeOut,这种情况下最小值为0。

  maximumPoolSize:核心池中的工作者线程的最大数量。

二、主要的方法:

  addWorker(Runnable firstTask, boolean core):检查新创建的工作者线程是否可以添加到当前状态且已经指定界限(无论是corePoolSize还是maximumPoolSize)的线程池。如果是这样的话,工作者线程的数量会相应的调整,可能的话就会创建新的工作者线程并启动它。如果线程池已经停止或符合shutdown的条件的话,那么这个方法就会返回false. 如果线程工厂创建线程失败(不管是返回null,还是抛出异常)也会返回false。

  execute(Runnable command):执行的三个步骤,①、如果是少于corePoolSize的线程正在运行,尝试使用的指定的任务command去启动一个新的线程,就像它的第一个任务一样调用addWorker方法,原子性的检查运行状态和工作线程数量,因此

  ②、如果一个线程成功的排队(加入到队列中),我们仍然需要重新检查:这个线程是否应该添加,在线程添加到这个方法以后,线程池是否已经关闭。

  ③、如果不能成功排队(不能将线程加入到队列中),那么就尝试添加一个新的工作者线程,如果添加失败的话,说明这个线程池已经关闭或者线程池已经饱和所以才会拒绝这个任务。

  

 

posted @ 2017-12-29 21:37  钓鱼翁  阅读(192)  评论(0编辑  收藏  举报