Executors.newFixedThreadPool 源码解析

标签: jdk源码 java线程池
12人阅读 评论(0) 收藏 举报
分类:

Executors 有个常用静态方法newFixedThreadPool(int nThreads),来构造线程池
今天我们其源码实现,探一探究竟


//new LinkedBlockingQueue<Runnable>()这里可以看出 是声明的无界队列大小,默认大小为Integer.MAX_VALUE
   public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

点进去看其实现
corePoolSize、maximumPoolSize 两个值设置为一样,keepAliveTime为空闲线程存活时间,when the number of threads is greater than the core,这里该值为0

//Executors.defaultThreadFactory() 用来构造线程的 Returns a default thread factory used to create new threads.
//defaultHandler: the default rejected execution handler,
//A handler for rejected tasks that throws a RejectedExecutionException 当 Runnable task处理不过来时会派上用场

//private static final RejectedExecutionHandler defaultHandler = new AbortPolicy();

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

再看下一步调用

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

至此调用完成。

总结:

  • newFixedThreadPool 提供一种快速构造线程池的接口,里面设置了很多默认参数,最终还是调用
    ThreadPoolExecutor来构造 ExecutorService,ThreadPoolExecutor本身是
    ExecutorService接口类的实现类。

  • 当默认参数不满足需要是,直接 使用 ThreadPoolExecutor进行构造线程池

查看评论

EventBus源码的简单解析

剔除繁杂的理论,注重实践,系统地讲解EventBus中的的源码
  • 2018年03月27日 09:22

Java自带的线程池Executors.newFixedThreadPool

线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程...
  • diweikang
  • diweikang
  • 2016-09-27 14:20:36
  • 2121

Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得

http://heipark.iteye.com/blog/1393847
  • sunmenggmail
  • sunmenggmail
  • 2014-06-17 11:02:32
  • 22853

线程池Executors.newFixedThreadPool

线程池Executors.newFixedThreadPool
  • bobo8945510
  • bobo8945510
  • 2016-08-06 11:22:00
  • 7591

Java 自带的线程池Executors.newFixedThreadPool

Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序...
  • jintianhen1
  • jintianhen1
  • 2014-01-13 09:21:27
  • 8012

java 通过Executors.newFixedThreadPool创建固定大小的线程执行器

当我们通过Executors的newCachedThreadPool方法来创建线程执行器的时候,会遇到线程池的线程数量问题。如果线程池中没有空闲的线程,执行器会自动的创建一个新的线程。如果有大量的任务...
  • qq_27603235
  • qq_27603235
  • 2016-06-26 15:00:15
  • 1327

Executors.newFixedThreadPool(NTHREADS)线程池数量设置多少合适?

并发编程中线程池 是跑不了的, 用过线程池的朋友 都会遇到这样的一个问题: 如何合理地估算线程池大小? 怎么样设置 数量,执行效率最高? 怎么样设置 内存消耗最低? 是不是设置 线程池数量越大...
  • xiaozei523
  • xiaozei523
  • 2017-02-27 11:36:08
  • 9182

Executors.newFixedThreadPool线程池的使用

ava5的线程池分好多种:具体的可以分为两类,固定尺寸的线程池、可变尺寸连接池。   在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解的是java.util.concurr...
  • u011191463
  • u011191463
  • 2017-03-14 17:42:31
  • 136

[笔记][Java7并发编程实战手册]4.3 创建固定的线程执行器newFixedThreadPool线程池

[笔记][Java7并发编程实战手册]系列目录简介 newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 创建一个...
  • mr_zhuqiang
  • mr_zhuqiang
  • 2015-08-25 21:53:32
  • 3405

ExecutorService,Executors 使用

JAVA 5之后,使用线程时,都离不开ExecutorService,这是一个借口,他继承了Executor接口。 这是API描述: Executor 提供了管理终止的方法,以及可为跟踪一个或多个...
  • xiancaieeee
  • xiancaieeee
  • 2013-06-28 17:28:21
  • 4363
    个人资料
    持之以恒
    等级:
    访问量: 2202
    积分: 332
    排名: 23万+
    文章存档
    最新评论