Java 线程池

四种经典线程池

1. newFixedThreadPool

newFixedThreadPool 将创建一个固定长度的线程池,每当提交一个任务时就创建一个新、线程,直到达到线程池的最大数量,这时线程池的规模将不再变化(如果某个线程由于发生了未预期的Exception而结束,那么线程池会补充一个新的线程)。

2. newCachedThreadPool

newCachedThreadPool 将创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程,线程池的规模不存在任何限制。

3. newSingleThreadExecutor

newSingleThreadExecutor 是一个单线程的
Executor,它创建单个工作者线程来执行任务,如果这个线程异常结束,会创建另一个线程来替代。newSingleThreadExecutor
能确保依照任务在队列中的顺序来串行执行(例如FIFO、LIFO、优先级)。

4. newScheduledThreadPool

newScheduledThreadPool 创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

Executor 的生命周期

为了解决执行服务的生命周期问题,Executor 扩展了 ExecutorService
接口,添加了一些用于生命周期管理的方法(同时还有一些用于任务提交的便利方法)。
ExecutorService 声明周期有3种状态:运行、关闭和终止。

  • shutdown 方法将执行平缓的的关闭过程:不再接受新的任务,同时等待已经提交提交的任务执行完成(包括那些还未开始执行的任务)。
  • shutdownNow 方法将执行粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。

在 ExecutorService 关闭后,提交的任务将由“拒绝执行处理器(Rejected Execution
Handler)”来处理,它会抛弃任务,或者使得 execute 方法抛出一个未检查的
RejectedExcutionException。等所有任务都完成后, ExecutorService 将转让终止状态。可以调用
awaitTermination 来等待 ExecutorService 到达终止状态,或者通过调用 isTerminated 来轮询
ExecutorService 是否已经终止。通常在调用 awaitTermination 之后会立即调用
shutdown,从而产生同步的关闭 ExecutorService 的效果。

ExecutorService 实现类

AbstractExecutorService, ForkJoinPool, ScheduledThreadPoolExecutor, ThreadPoolExecutor

Timer 存在缺陷用 ScheduledThreadPoolExecutor 代替

  1. 定时精准性可以遭到破坏。
  2. 可能出现“线程泄露”。

参考资料

  • 《Java 并发编程实战》ISBN 978-7-111-37004-8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章