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

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("根据自己的业务情况,决定编写的代码!");
     }
}

https://openatomworkshop.csdn.net/674017c9522b003a546de8ce.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MzAzMzEzMywiZXhwIjoxNzMzMjkwNjAyLCJpYXQiOjE3MzI2ODU4MDIsInVzZXJuYW1lIjoicXFfNDM2ODg3OTAifQ.-46oqGeDTKpQEfuBo5U2Zz_JAAV0ZjyZp0YAbHerpRA&spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~activity-2-128619952-blog-113090031.235^v43^pc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~activity-2-128619952-blog-113090031.235^v43^pc_blog_bottom_relevance_base7&utm_relevant_index=4

posted on   ~码铃薯~  阅读(118)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2021-08-31 适配器模式

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示