1.如果线程池中的线程小于核心线程,新加入的线程对象默认会开启新的线程,直到超过核心线程
2.如果好过了核心线程就会先将线程对象放在队列中,队列里面放不下了,且核心线程数小于最大线程数,就会开启新的线程来执行线程对象
3.如果后两者都满了,则拒绝任务,抛出异常
1.newFixedThreadPool(int nThreads)
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
创建固定大小的线程池,corePoolSize和maxinumPoolSize都设置为相同大小,大于核心线程的空余线程等待的事件为0秒,队列为Integer.MAX_VALUE大小的队列(可视为无界队列)。
假设参数设置的线程数为5,由于设置的队列为无界队列,所以设置的maxinumPoolSize是没有意义的,因为超过核心线程数的线程对象会存放在队列中,所以永远不会用到最大线程数
2.newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
创建单一线程的线程池,由于使用无界队列,maxinumPoolSize无效,就是单一线程执行串行任务。这就相当于newFixedThreadPool(1)。
3.newCachedThreadPool()
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
核心线程数为0,最大线程数为Integer.MAX_VALUE,相当于无界,由于使用的是直接提交的队列,加入队列前会判断该队列中是否有任务,有就会加入队列失败,会先寻找空余线程来执行,如果没有空余线程就创建新的线程执行任务。这样感觉这个队列没什么作用,就相当于没有空余进程就创建新的进程,否则加入空余进程。
注意:在使用SynchronousQueue通常要求maximumPoolSize是无界的,如果是有界,由于SynchronousQueue只能存放一个会很容易达到最大线程数,就会抛异常。