Java线程池中线程拒绝策略介绍
拒绝策略:在使用Java线程池的时候,堵塞队列满了的情况下对新任务采用的策略,默认策略是AbortPolicy
1.1、CallerRunsPolicy
如果线程池没关闭则使用当前线程执行任务,否则抛弃任务
1 /* 2 * 运行被拒绝任务的被拒绝任务处理程序 3 * 直接在{@code execute}方法的调用线程中, 4 * 除非执行器已关闭,否则将执行任务 5 * 被丢弃。 6 */ 7 public static class CallerRunsPolicy implements RejectedExecutionHandler { 8 /** 9 * Creates a {@code CallerRunsPolicy}. 10 */ 11 public CallerRunsPolicy() { } 12 13 /** 14 除非执行者执行,否则在调用者的线程中执行任务r 15 *已关闭,在这种情况下,该任务将被丢弃。 16 * 17 * @param r请求执行的可运行任务 18 * @param e试图执行此任务的执行者 19 */ 20 public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { 21 if (!e.isShutdown()) { 22 r.run(); 23 } 24 } 25 }
1.2、AbortPolicy
拒绝执行任务,并抛出异常
/** *拒绝任务的处理程序抛出一个 * {@code RejectedExecutionException}。 */ public static class AbortPolicy implements RejectedExecutionHandler { /** * Creates an {@code AbortPolicy}. */ public AbortPolicy() { } /** * 总是抛出RejectedExecutionException。 * @param r请求执行的可运行任务 * @param e试图执行此任务的执行者 * @总是抛出RejectedExecutionException */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + e.toString()); } }
1.3、DiscardPolicy
默默拒绝任务
/** 处理被拒绝任务的处理程序,将其静默丢弃 *拒绝任务。 */ public static class DiscardPolicy implements RejectedExecutionHandler { /** * Creates a {@code DiscardPolicy}. */ public DiscardPolicy() { } /** *不执行任何操作,具有丢弃任务r的作用。 * * @param r请求执行的可运行任务 * @param e试图执行此任务的执行者 */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { } }
1.4、DiscardOldestPolicy
丢弃最前面的任务,将当前任务加入到队列
/** *拒绝任务的处理程序,丢弃最旧的未处理程序 *请求,然后重试{@code execute},除非执行者 *被关闭,在这种情况下该任务被丢弃。 */ public static class DiscardOldestPolicy implements RejectedExecutionHandler { /** * Creates a {@code DiscardOldestPolicy} for the given executor. */ public DiscardOldestPolicy() { } /** *获取并忽略执行者的下一个任务 *如果立即可用,则将执行; *,然后重试任务r的执行,除非执行者 *被关闭,在这种情况下,任务r被丢弃。 * * @param r请求执行的可运行任务 * @param e试图执行此任务的执行者 */ public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { if (!e.isShutdown()) { e.getQueue().poll(); e.execute(r); } } }

浙公网安备 33010602011771号