本文只做简要解析,实际情形下我们多用spring的taskExecutor
直接使用new Thread()创建线程的缺点:
1、new Thread()耗费性能
2、调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。
3、不利于扩展,比如如定时执行、定期执行、线程中断
使用线程池的优点:
1、可重用存在的线程,减少对象创建、消亡的开销,性能佳
2、可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
3、提供定时执行、定期执行、单线程、并发数控制等功能
----------------------------------------------------------------------------------------------
Exector继承树
解析:
Executor接口(执行器)
位于java.util.cocurrent 包下,内部包含线程池的实现,Java 5后引入,用于启动、调度、管理线程(利用内部的线程池)。
备注:通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题。
注意:Executor!= 线程池,Executor>线程池
ExecutorService接口
继承自Executor 接口
Executors类
通过工厂方法来创建不同的线程池,如:newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool。
1.public static ExecutorService newFixedThreadPool(int nThreads)
创建固定数目线程的线程池,当线程池满,多出的任务得在队列等待。
2.public static ExecutorService newCachedThreadPool()
线程数目不固定,使用完后不立即关闭,而是在缓存中存放60s。当我们调用execute时如果缓存中有线程,将重用,否则新建一个。
3.public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
4.public static ScheduledExecutorService newScheduledThreadPoolExecutor(int corePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。