前言: Java提供的 Executor 都在JUC (java.util.concurrent) 包下面,主要包括:线程池工厂类Executors,线程池实现类ThreadPoolExecutor等
线程池 ThreadPoolExecutor 通常都是通过 Executors 来创建的
// 返回一个可根据实际情况调整线程个数的线程池
Executors.newCachedThreadPool();
// 创建一个固定数量的线程池
Executors.newFixedThreadPool(10);
// 创建一个线程数量为1的线程池
Executors.newSingleThreadExecutor();
// 返回一个ScheduledExecutorService对象
//该对象也是调用父类的线程池方法,类似newFixedThreadPool
Executors.newScheduledThreadPool(5);
Executors.newCachedThreadPool( )
创建一个数目无上限,但是线程不会轻易销毁的线程池
初始情况下,线程池里没有线程,随着注册任务进去,就会创建一些线程来处理任务,任务完成之后,线程不会立刻销毁,而是仍然存在等待执行新的任务
若有任务则没线程时则创建线程,每个线程空闲等待时间为60秒,60秒后如果该线程没有任务可执行,则被回收;(核心线程数量为0,最大线程数量为最大,空闲等待时间为60s)
源码:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
threadFactory);
}
Executors.newFixedThreadPool(10)
创建一个固定大小的线程池 (线程数目是固定的),不管任务再怎么多,线程数目也不会新增,任务就会在阻塞队列中排队 (工作中最主要使用的线程池)
当有任务提交时,若线程池中有空闲线程,则立即执行,若没有,则会被缓存在一个任务队列中等待有空闲的线程再去执行;(核心线程数等于最大线程数,默认空闲时间为0,空闲立马销毁)
源码:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
}
Executors.newSingleThreadExecutor( )
创建一个线程数量为1的线程池
若空闲则执行,否则入队列等待被执行;(核心线程数量为1,最大线程数量也为1,空闲等待时间为0)
源码:
该方法有2个实现,一个带自定义的线程工厂,一个不带
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory));
}
Executors.newScheduledThreadPool(5)
和定时器的效果类似
源码:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://xhuahua.blog.csdn.net/article/details/122129056
内容来源于网络,如有侵权,请联系作者删除!