多线程 线程池饱和策略
RejectedExecutionHandler
(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。
这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。
在JDK 1.5中Java线程池框架提供了以下4种策略。
拒绝策略 | 功能 |
---|---|
ThreadPoolExecutor.AbortPolicy (默认) | 直接抛出RejectedExecutionException 来拒绝新任务的处理。 |
ThreadPoolExecutor.DiscardPolicy | 不处理,丢弃掉。 |
ThreadPoolExecutor.DiscardOldestPolicy | 丢弃队列里最近的一个任务,并执行当前任务。 |
ThreadPoolExecutor.CallerRunsPolicy | 不进入线程池执行,任务将由调用者线程去执行。也就是直接在调用execute 方法的线程中运行被拒绝的任务。如果执行程序已关闭,则会丢弃该任务。 当最大池被填满时,此策略为我们提供 可伸缩队列。 因此这种策略会降低对于新任务提交速度,影响程序的整体性能。如果您的应用程序可以承受此延迟并且你要求任何一个任务请求都要被执行的话,你可以选择这个策略。 |
自定义策略 | 以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。 如记录日志或持久化存储不能处理的任务。 |
-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明