线程池ThreadPoolExecutor剖析

Posted x_k

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池ThreadPoolExecutor剖析相关的知识,希望对你有一定的参考价值。

Executor框架

Java线程池的实现主要是通过具体类ThreadPoolExecutor来实现的。


Executor:声明execute(Runnable command)方法。(注释:在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程执行,这由Executor实现决定

ExecutorService:继承Executor接口,另外添加一些其他方法,如:关闭池、返回任务处理结果。

AbstractExecutorService:实现ExecutorService接口,对其声明的方法进行具体实现。即ExecutorService的默认实现。

ThreadPoolExecutor:线程池具体实现类。

ThreadPoolExecutor剖析

构造


参数:
corePoolSize - 池中所保存的线程数,包括空闲线程。
maximumPoolSize - 池中允许的最大线程数。
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
unit - keepAliveTime 参数的时间单位。
workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。
threadFactory - 执行程序创建新线程时使用的工厂。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。

应用

当线程池进行初始化,构造参数workQueue(任务队列)无论是否存在任务,线程池都不会立刻创建工作线程进行处理。(当调用execute、prestartCoreThread、prestartAllCoreThreads、setCorePoolSize等方法会创建工作线程)

execute

JDK1.7.0_79源码:

public void execute(Runnable command) 
        if (command == null)
            throw new NullPointerException();

        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) 
            if (addWorker(command, true))
                return;
            c = ctl.get();
        
        if (isRunning(c) && workQueue.offer(command)) 
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        
        else if (!addWorker(command, false))
            reject(command);
    
  1. 如果少于corePoolSize的线程数正在运行,尝试启动一个新的线程,并且将当前command作为该线程的第一个任务。调用addWorker来原子地检查runstate和workerCount,并且通过返回false,来防止错误的指示,添加不应该添加的线程。
  2. 如果一个task可以成功排队,那么我们仍然需要两次检查。one:我们是否需要添加一个线程(因为存在上次检查的一个已经死亡)。two:线程池从进入此方法是否关闭。所以我们重新检查状态,并且如果有必要,线程池关闭了,可以回滚入队,或者一个worker都没有,那么启动一个新worker。
  3. 如果我们无法排队任务,那么我们尝试添加一个新的线程。如果失败,我们知道线程池关闭了或者队列饱和了,所以拒绝这个task。

    ctl是AtomicInteger变量,保存了两个内容,所有线程的数量,每个线程所处状态

测试

Git传送门

帮助链接

线程池内部实现机制可以参考下面的链接:
http://shamrock.blog.51cto.com/2079212/1850895
其他:http://note.youdao.com/noteshare?id=f4fdbadae387dcbac1c53e8de2509dfd

以上是关于线程池ThreadPoolExecutor剖析的主要内容,如果未能解决你的问题,请参考以下文章

Java Review - 并发编程_ThreadPoolExecutor原理&源码剖析

Java Review - 并发编程_ThreadPoolExecutor原理&源码剖析

JDK1.7中的ThreadPoolExecutor源代码剖析

史上最清晰线程池实现原理剖析

JDK线程池原理剖析

Java并发编程——线程池