线程池ThreadPoolExecutor中RejectedExecutionHandler常见拒绝策略

~码铃薯~ / 2024-08-31 / 原文

JDK提供的几种拒绝策略:

AbortPolicy:当前拒绝策略会在无法处理任务时,直接抛出一个异常。

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    throw new RejectedExecutionException("Task " + r.toString() +
                                         " rejected from " +
                                         e.toString());
}

CallerRunsPolicy:如果任务被拒绝了,则由调用线程(提交任务的线程)直接执行此任务(谁提交的谁执行)

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    if (!e.isShutdown()) {
        r.run();
    }
}

DiscardPolicy:直接将任务丢弃掉。一般情况下很少这么干。

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}

DiscardOldestPolicy:当前拒绝策略会在线程池无法处理任务时,将队列中最早的任务丢弃掉,将当前任务再次尝试交给线程池处理

public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    if (!e.isShutdown()) {
        e.getQueue().poll();	
        e.execute(r);
    }
}

自定义拒绝Policy:需要我们实现RejectedExecutionHandler接口,并重写里面的rejectedExecution()方法,根据自己的业务,可以将任务扔到数据库,也可以做其他操作。

private static class MyRejectedExecution implements RejectedExecutionHandler{
     @Override
     public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
     	System.out.println("根据自己的业务情况,决定编写的代码!");
     }
}