java线程池
参考文献
1.Java并发编程:线程池的使用
2.由浅入深理解Java线程池及线程池的如何使用
为什么需要线程池?
并发编程里,每个线程会执行一些任务。当任务处理完毕后,线程的生命周期就会结束销毁。但有一个问题就是线程频繁创建与销毁需要耗费大量的资源,如果存在可以复用线程的方法那么运行效率就会大大提升,线程池的概念就出现了。
线程池的基本概念就是创建一批线程,然后当有任务需要执行时,就取出线程然后执行任务,完成任务后就把线程放回池中,已达到复用线程的目的
ThreadPoolExecutor类
线程池最基础的类,由它为基础实现四种常见的线程池,用以适用不同的环境下使用。四种线程池的具体实现方法可参照参考文献2
newFixedThreadPool线程池
大小在初始化时固定了的线程池,在运行过程中线程池的线程数量不变。
当新任务提交时,如果有空闲线程,则会立即执行,如果没有,则会暂时存入阻塞队列。所以如果任务提交十分频繁,则可能会出现存放任务的队列迅速增大占用大量资源的问题。还有一个问题就是,即使线程池长时间空闲,它也不会主动释放线程,会持续占用资源。
newSingleThreadExecutor线程池
只有一个线程的线程池,会将阻塞的任务存到队列中然后空闲时执行。
newCachedThreadPool线程池
缓存线程池,缓存的线程默认存活60秒,初始大小corePoolSize为0,最大大小为Integer.MAX_VALUE。
使用这个线程池时,他会不断的增加新的线程去执行新的任务,当线程空闲时间超过一定时间时(默认60s),则会回收线程。
newScheduledThreadPool线程池
定时线程池,可以周期性的执行任务,比如用于周期性同步数据