项目概况

成熟的线程要懂得拒绝

2026-01-291 min read后端技术
Java进阶

作者: 西魏陶渊明 博客: https://blog.springlearn.cn/

!!! tip 西魏陶渊明 莫笑少年江湖梦,谁不少年梦江湖 !!!tip 稻盛和夫说:你不会的东西,觉得难的东西,一定不要躲,先搞明白,后精湛,你就比别人优秀了。因为大部分人都不舍得花力气去钻研,自动被淘汰,所以你执着的努力,就占了大便宜。 !!! !!!

拒绝策略

拒绝策略就是任务实在是已经执行不了,那么就需要你告诉程序,怎么样去拒绝在执行其他任务

在实际开发场景中,基本使用JDK自带的策略就可以完成日常开发,但是作为程序员必须要知道。下面说一下JDK自带有哪些线程策略

java
1public interface RejectedExecutionHandler { 2 void rejectedExecution(Runnable r, ThreadPoolExecutor executor); 3}

四种拒绝策略

ThreadPoolExecutor类里面是内置了4中拒绝策略,我们一个一个来分析

1. CallerRunsPolicy

直接执行该任务,如果线程池已经关闭,就不运行

java
1 public static class CallerRunsPolicy implements RejectedExecutionHandler { 2 public CallerRunsPolicy() { } 3 public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { 4 if (!e.isShutdown()) { 5 r.run(); 6 } 7 } 8 }

2. AbortPolicy 【默认策略】

直接报异常,简单粗暴

java
1public static class AbortPolicy implements RejectedExecutionHandler { 2 public AbortPolicy() { } 3 public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { 4 throw new RejectedExecutionException("Task " + r.toString() + 5 " rejected from " + 6 e.toString()); 7 } 8 }

3. DiscardPolicy

直接丢弃,不记录任何信息

java
1 public static class DiscardPolicy implements RejectedExecutionHandler { 2 public DiscardPolicy() { } 3 public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { 4 } 5 }

4. DiscardOldestPolicy

丢弃一个老任务,然后执行当前任务

java
1public static class DiscardOldestPolicy implements RejectedExecutionHandler { 2 public DiscardOldestPolicy() { } 3 public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { 4 if (!e.isShutdown()) { 5 // Retrieves and removes the head of this queue 移出最头任务,也就是老任务 6 e.getQueue().poll(); 7 e.execute(r); 8 } 9 }

分析

拒绝策略其实很简单,知己知彼百战百胜,在多线程多任务编程场景下,我们可以根据业务特性定义拒绝策略。 比如,在任务满的情况将,任务放到数据库中,或者打印到特殊的日志中,用来恢复任务。

最后求关注,求订阅,谢谢你的阅读!