一、介绍
1.系统启动一个新线程的成本是很高的,因为他涉及与操作系统交互,
尤其需要大量生存期很短暂的线程时,更应该考虑使用线程池
2.【使用线程池可以有效地控制系统中并发线程的数量】,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃。而线程池的最大线程参数可以控制系统中并发线程数不超过此数
3.过程:
与数据库连接池相似的是,线程池在系统启动时即创建大量空闲的线程,
【程序将一个Runnable对象传给线程池(使用excecute()或者submit()),线程池就会启动一个线程来执行他们的run()】;
当run()执行结束后,该线程不会死亡,而是再次返回线程池中成为【空闲状态】
4、//TODO
二、面试相关
下面1,2转自https://blog.csdn.net/java_wht/article/details/71700012
1、引入线程池的原因:
由于线程的生命周期中包括,创建-就绪-运行-阻塞-挂机-结束 阶段,当我们处理的任务数目比较小的时候,我们可以自己创建几个线程来处理相应的任务,但是有大量的任务时,由于创建和销毁线程都需要很大的开销,运用线程池就可以大大的缓解这些内存开销很大的问题。
2、线程池的使用:
Executor类给我们提供了的静态方法,就可以创建相应的线程池:
public static executorService newSigleExecutor();
public static executorService newFixedThredPool();
public static executorService newCachedThreadPool();
1. newCachedThreadPool 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用他们 具体如下,转 https://blog.csdn.net/QH_JAVA/article/details/54929996
|
4、使用线程池来执行线程任务的步骤
1)使用Excecutor类的静态工厂方法(如上述方法newSingleExcecutor(),newFixedThreadPool(),newCachedThreadPool()),来创建一个ExcecutorService对象,该对象代表一个线程池;
2)创建Runnable实现类,作为线程执行的任务
3)调用ExcecutorService对象的submit方法或execute方法提交runnable实例
4)当不想提交任何任务时,调用ExcecutorService对象的shutdown()来关闭线程池
5、相关方法:
shutdown() 会启动线程池的关闭序列,调用shutdown()方法后的线程池不再接受新任务,但会将以前所有已经 提交的任务执行完毕; 当所有的任务都执行完毕后,池中的所有线程死亡 ;
execute(Runnable x) 开启线程池中的任务 ; 没有返回值。
但无法判断任务是否成功完成
submit(Runnable x) 开启线程池中的任务,返回一个future。
可以用这个future来判断任务是否成功完成