Executors 是一个Java中的工具类。提供工厂方法来创建不同类型的线程池。
常用方法:
1.newSingleThreadExecutor
介绍:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。
此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
优点:单线程的线程池,保证线程的顺序执行
缺点:不适合并发
2.newFixedThreadPool
介绍:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
优点:固定大小线程池,超出的线程会在队列中等待
缺点:不支持自定义拒绝策略,大小固定,难以扩展
3.newCachedThreadPool
介绍:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
优点:很灵活,弹性的线程池线程管理,用多少线程给多大的线程池,不用后及时回收,用则新建
缺点:一旦线程无限增长,会导致内存溢出
4.newScheduledThreadPool
介绍:创建一个定长线程池,支持定时及周期性任务执行
优点:一个固定大小线程池,可以定时或周期性的执行任务
缺点:任务是单线程方式执行,一旦一个任务失败其他任务也受影响
总结1)以上线程池都不支持自定义拒绝策略。
2)newFixedThreadPool 和 newSingleThreadExecutor:
主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。
3)newCachedThreadPool 和 newScheduledThreadPool:
主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。
ThreadPoolExecutor阿里巴巴的JAVA开发手册推荐用ThreadPoolExecutor创建线程池。集以上优点于一身。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler);