jdk自带的线程池供我们使用的主要是ThreadPoolExecutor类
创建线程池:
1、使用Executors工厂类
Executors主要提供了几种创建线程池的方法
1)newFixedThreadPool(固定大小的线程池)
每次提交任务就创建一个线程,直到线程到达线程池的最大大小,线程池的大小一旦达到最大值就会保持不变,如果某线程因执行异常而结束,那么线程池就会补充一个新线程
2)newSingleThreadExecutor(单线程的线程池)
这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务
3)newScheduledThreadPool(定时任务调度的线程池)
创建一个大小无限的线程池,此线程池支持定时以及周期执行任务需求
4)newCachedThreadPool(可缓存的线程池)
如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数量增加是,此线程池又可以只能的添加新的线程来处理任务,此线程池不会对线程池大小做限制,线程池的大小完全取决于操作系统能够创建的最大线程数
2、继承ThreadPoolExecutor类,并复写父类的构造方法
线程池的生命周期
启动线程池
线程池在构造前是初始状态,一旦构造完成线程池就进入了执行状态running。严格意义上讲线程池构造完成后并没有线程被立即启动,只有进行"预启动"或者接收到任务的时候才会启动线程。
关闭线程池
线程池运行中可以通过shutdown()和shutdownNow()来改变运行状态。
shutdown():平缓的关闭线程池。线程池停止接受新的任务,同时等待已经提交的任务执行完毕,包括那些进入队列还没有开始的任务。shutdown()方法执行过程中,线程池处于SHUTDOWN状态。
shutdownNow():立即关闭线程池。线程池停止接受新的任务,同时线程池取消所有执行的任务和已经进入队列但是还没有执行的任务。shutdownNow()方法执行过程中,线程池处于STOP状态。
线程池结束
一旦shutdown()或者shutdownNow()执行完毕,线程池就进入TERMINATED状态,即线程池就结束了。
isTerminating() 如果关闭后所有任务都已完成,则返回 true。
isShutdown() 如果此执行程序已关闭,则返回 true。