java有四种线程池
Executors.newSingleThreadExecutor
Executors.newFixedThreadPool
Executors.newCachedThreadPool
Executors.newScheduledThreadPool
这四种线程池,本质上,都是调用ThreadPoolExecutor方法进行构造的。
那么他们的差异在本质上是什么造成的呢?两点
1.线程数 2排队的阻塞队列类型
上代码 Executors
1.newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
可以看到,核心线程数,最大线程数都是1,排队队列是LinkedBlockingQueue,队列大小是Integer.MAX_VALUE
- newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
可以看到,核心线程数,最大线程数都是n,排队队列也是LinkedBlockingQueue,队列大小是Integer.MAX_VALUE
- newCachedThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
核心线程数0,最大线程数Integer.MAX_VALUE,排队队列跟之前的不一样了,是
SynchronousQueue。
- newScheduledThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
核心线程n,最大线程 Integer.MAX_VALUE,最特殊的是队列DelayedWorkQueue
核心线程数和最大线程数的区别自己体会,主要说一下这个排队队列
1.newCachedThreadPool,采用的是一个SynchronousQueue,其内部并没有数据缓存空间,一个插入操作总是对应一个移除操作,新任务到来时,这个线程池就会创建新的线程
- newScheduledThreadPool ,这个线程池采用的队列是DelayedWorkQueue,这个阻塞队列的特点
1). 按照执行延迟从短到长的顺序把任务存储到堆;
2). 通过leader线程让拿到任务的线程等到规定的时间点再执行任务;具体见
https://www.cnblogs.com/wanly3643/p/3929761.html
网友评论