本篇文章介绍线程池工厂类Executors, 但是实际开发中已经不允许使用该类去创建线程池, 可参考"阿里Java开发规范"的说明:
Executors的几种创建线程池的方法:
1. 创建一个单线程的线程池
public static ExecutorService newSingleThreadExecutor(){}
特点:
1.单线程的线程池是按照FIFO顺序执行的
2.线程池中唯一的线程存活时间是无限的
3.当池中的线程忙碌时新提交的线程会进入内部的阻塞队列中,并且阻塞队列是无界的无界队列有可能使服务器资源耗尽
关闭线程池
public void shutdown(): 调用后线程池状态为SHUTDOWN,不能在添加新的任务,否则抛出异常RejectedExecutionException. 等待原池中任务执行完线程池才会退出.
public List<Runnable> shutdownNow(): 线程池状态立即变为STOP,并且停止所有正在执行的线程. 在阻塞队列中的任务会被返回.
2. 创建固定数量的线程池
public static ExecutorService newSingleThreadExecutor(int threads)
3. 创建可缓存的线程池
Executors.newCachedThreadPool()
特点:
1.线程池没有大小限制,受限于操作系统或JVM参数控制.
2.池中空闲线程超过60秒就会被回收.
弊端:
1.线程池没有最大数量限制,有资源耗尽风险
4.可调度线程池
一个可以提供"延迟"和"周期性"任务调度功能的线程池ScheduledExecutorServic.
创建方法
public void newSingleThreadScheduledExecutor(): 创建一个可调度线程池, 池中仅含有一个线程
public void newSingleThreadScheduledExecutor(int corePoolSize): 创建一个可调度线程池,池中线程数由参数控制