线程池策略(一)
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。