使用Executors创建ExecutorService对象原理简析

     相信有很多同学一提到用线程池去控制线程,就有一种无从下手的感觉,大脑瞬加发麻,放心我将教大家怎么创建线程池,下面开始啦!  大家快打开as准备走起得意

     Executors就是一个生产线程池对象的工厂,它提供了很多静态方法给大家调用,只需一个 “.” 就搞定ExecutorService对象的创建,但是当你看到它需要的形参列表时,你就会说很简单啊,有的就一个参数,直接传入线程池中线程的多少就可以了,其实这只是表面你看到的,当你点击进入看它内部实现的时候,你就会发现内部是通过ThreadPoolExecutor类来实现的,下面介绍一下这类:

    

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

      大家会看见这个类的构造方法中有五个参数,第一个参数:核心线程数(在池中保留的线程数,即使它们是空闲的);第二个参数:最大线程数(池中允许的最大线程数);第三个参数:线程保活时间(当线程数大于内核数时,这是多余空闲线程在终止之前等待新任务的最大时间);第四个参数:时间单元格式(针对的是第三个参数的计量单位格式);第五个参数:工作任务队列(用于在执行任务之前保存任务的队列,此队列只保留该方法提交的任务)。

     现在都知道参数对应的意义了,接下来看下一个this调用的构造函数:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) {
    if (corePoolSize < 0 ||
        maximumPoolSize <= 0 ||
        maximumPoolSize < corePoolSize ||
        keepAliveTime < 0)
        throw new IllegalArgumentException();
    if (workQueue == null || threadFactory == null || handler == null)
        throw new NullPointerException();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
}
     这个参数列表里多了两个参数,threadFactory参数:当executor创建新线程时使用该工厂创建;handler参数:当超过队列容量与线程界限,添加任务被阻塞时,使用该handler处理添加的任务;

    通过上述方法参数与执行顺序的讲解,相信大家对这个工作流程有了一定的了解,有不足之处,大家多批评指正微笑

猜你喜欢

转载自blog.csdn.net/chun_long/article/details/58599309