Java线程池的四种实现方法及实现原理及分析
一、为什么要用线程池
线程池就是创建多个线程并且进行管理的容器,线程池是个容器,可以创建线程和管理线程,并且给线程分配任务。
比如在一个项目中 ,全都是用new Thread的方式去启动线程,那么创建好Thread1,而1在运行的时,创建了Thread2,等等,创建了10个线程的时候,1,2,3都执行完毕了但是没有被销毁,就可能导致无限制的新建线程,相互竞争,占用过多的系统资源,导致死锁及OOM。而且这些线程缺乏统一的管理功能,也缺乏定期执行,定时执行,线程中断的功能。
这时可以用线程池,主要好处:重用已经存在的线程,减少了线程的创建和销毁的开销;可有效控制最大并发的线程数,提高了系统资源的使用率避免很多竞争,避免了oom死锁;可以提供定时和定期的执行方式,单线程,并发数量的控制等功能。线程池可以使得对线程的管理更加方便,并且对高并发的控制尽在掌握。
二、四种不同Java线程池的功能及分析
线程池都继承了ExecutorService的接口,所以他们都具有ExecutorService的生命周期方法:运行、关闭、终止
因为继承了ExecutorService接口,所以它在被创建的时候就是处于运行状态,当线程没有任务执行时,就会进入关闭状态,只有调用了shutdown()的时候才是正式的终止了这个线程池。
java通过Executors工厂类提供我们的线程池一共有4种:
fixedThreadPool() //启动固定线程数的线程池
CachedThreadPool() //按需分配的线程池
ScheduledThreadPoolExecutor()//定时,定期执行任务的线程池
ThreadPoolExecutor()//指定线程数的线程池。
三、实现过程