Java 线程池 之 ThreadPoolExecutor 中定义的拒绝策略

拒绝策略

分类

策略具体执行内容
AbortPolicy直接抛出异常。 该策略为未具体设置策略时的默认策略。
DiscardPolicy直接丢弃任务,无任何其他操作。
DiscardOldestPolicy丢弃队列中的最靠前的任务。
CallerRunsPolicy让调用者线程执行当前任务。

触发条件

  • 队列已满并且线程池中线程数量已达到最大线程数,新加任务触发拒绝策略

具体代码

所用的拒绝策略类都是实现了接口 RejectedExecutionHandler

public interface RejectedExecutionHandler {
  /**
     * 当线程池无法接受任务时(队列或者线程池已满),执行此方法。
     * 或者线程池关闭时,执行此方法。
     *
     * 该方法会抛出未检查异常 RejectedExecutionException,
     * 传播到 execute() 方法的调用者哪里
     *
     * @param r 需要执行的可执行任务
     * @param executor 执行此任务的线程池
	 * @throws RejectedExecutionException 
     */
    void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}


AbortPolicy
public static class AbortPolicy implements RejectedExecutionHandler {

    public AbortPolicy() { }

	// 抛出 RejectedExecutionException 异常,此策略未判断线程池的关闭状态
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        throw new RejectedExecutionException("Task " + r.toString() +
                                             " rejected from " +
                                             e.toString());
    }
}

DiscardPolicy
public static class DiscardPolicy implements RejectedExecutionHandler {

    public DiscardPolicy() { }

	// 源码可知,该方法中未执行任何操作。
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    }
}

DiscardOldestPolicy
public static class DiscardOldestPolicy implements RejectedExecutionHandler {

    public DiscardOldestPolicy() { }
	
	// 获取队列中的下一个任务并忽略,然后重试执行任务
	// 如果线程池处于已关闭状态,则直接忽略该任务
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            e.getQueue().poll();
            e.execute(r);
        }
    }
}

CallerRunsPolicy
public static class CallerRunsPolicy implements RejectedExecutionHandler {

    public CallerRunsPolicy() { }

	// 由调用 execute() 的线程执行该任务
	// 如果线程池处于已关闭状态,则直接忽略该任务
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        if (!e.isShutdown()) {
            r.run();  // 由调用者线程执行该任务。
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值