各种线程池父类:ThreadPoolExecutor
构造函数如下:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
...
}
参数解释:
corePoolSize:线程池会保留的线程数(当为0的时候,keepAliveTime删除)
maximumPoolSize:线程池中最大线程数
keepAliveTime:当线程池中线程数大于corePoolSize时,空闲线程的存活时间
TimeUnit :时间单位
BlockingQueue:阻塞队列,用以存放线程
ThreadFactory:线程工厂
RejectedExecutionHandler:被拒绝handler
1.newCachedThreadExecutor
public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用
execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。
2.newFixedThreadPool
顾名思义可以控制并发线程数
实现:
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
同时运行不会超过固定最大线程数,当达到之后,后续的线程将加入阻塞队列,等之前任务结束之后从阻塞队列获取新的任务
3.newScheduledThreadExecutor
创建一个可定时单线程线程池,可以延时,可以定时来执行任务,当一个任务异常后,会创建一个新任务
4.newSingleScheduledThreadExecutor
保证线程池只有一个线程运行,当线程死掉会有新线程被启动