线程池策略(一)

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

  java.util.concurrent.Executors可以产生三种线程池,线程执行的底层代码还是同一个。

  先解释一下ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory)这个类,

corePoolSize:代表线程池中常存的线程数量。

maximumPoolSize:指线程池最多可容纳的线程数量。

keepAliveTime和unit:配合使用,前者是数字,后者是时间单位,意思是当某个线程在规定的时间内没有执行,就会被kill掉,等于0表示不会kill掉。

workQueue:指等待执行的线程队列,有很多种,可以是数组实现的,也可以是链表实现的,所以它既可以是有界的,也可以是无界的。

threadFactory:线程池线程产生的工厂类。

1.newFixedThreadPool(int nThreads),newFixedThreadPool(int nThreads, ThreadFactory threadFactory)

  return 一个new ThreadPoolExecutor(xxx..),n代表的是线程池中固定可重用的数量,而corePoolSize和maximumPoolSize都等于这个n,所以如果一个任务被提交后,会先调用这n个线程中的一个执行,如果线程池满了,则进入workQueue队列等待,如果等待队列也满了,就比较线程池中是否已经达到最大执行线程数量,如果没有达到,放入线程池执行,如果达到了则拒绝接收任务并报reject异常。

2.newCachedThreadPool(),ExecutorService newCachedThreadPool(ThreadFactory threadFactory),

  return 一个newThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());

线程池初始线程数为0,可以一直增加到Integer的最大值,某个线程超过60s没有执行内容的话,就会被回收。其等待队列SynchronousQueue中的任务执行策略,默认构造函数为:

public SynchronousQueue() {
        this(false);
    }

下面另一个构造函数解释了false的含义:fair if true, waiting threads contend in FIFO order for access; otherwise the order is unspecified.所以显示指定了true才能保证先到先执行,否则未指明哪个先执行。

所以当有特别的需要的时候,可以按照需要直接构建ThreadPoolExecutor。

原文地址:https://www.cnblogs.com/azul0906/p/4214248.html