多线程编程之成熟的线程要懂得拒绝

简介: 成熟的线程要懂得拒绝: 拒绝策略就是任务实在是已经执行不了,那么就需要你告诉程序,怎么样去拒绝在执行其他任务

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

拒绝策略

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

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

public interface RejectedExecutionHandler {
    void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}

四种拒绝策略

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

1. CallerRunsPolicy

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

    public static class CallerRunsPolicy implements RejectedExecutionHandler {
        public CallerRunsPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                r.run();
            }
        }
    }

2. AbortPolicy 【默认策略】

直接报异常,简单粗暴

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

3. DiscardPolicy

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

 public static class DiscardPolicy implements RejectedExecutionHandler {
        public DiscardPolicy() { }
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        }
    }

4. DiscardOldestPolicy

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

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

分析

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

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

相关文章
|
4月前
|
设计模式 消息中间件 安全
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(二)
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(二)
34 1
|
7月前
|
安全 Java 容器
Java多线程编程中的线程安全集合:保护数据的铁壁
Java多线程编程中的线程安全集合:保护数据的铁壁
90 1
|
7月前
|
安全 Java 调度
Java多线程编程的默契对话:线程通信的艺术
Java多线程编程的默契对话:线程通信的艺术
38 0
|
7月前
|
安全 Java
Java多线程编程中的线程安全与最佳实践
Java多线程编程中的线程安全与最佳实践
52 0
|
4月前
|
设计模式 存储 Java
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(四)
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(四)
94 1
|
4月前
|
设计模式 存储 安全
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(三)
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(三)
39 2
|
4月前
|
设计模式 Java 关系型数据库
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(一)
多线程编程设计模式(单例,阻塞队列,定时器,线程池)(一)
30 0
|
5月前
|
设计模式 安全 Java
《Linux从练气到飞升》No.31 多线程编程实践与线程安全技术
《Linux从练气到飞升》No.31 多线程编程实践与线程安全技术
33 0
|
7月前
|
Java 程序员 数据处理
【Java 多线程编程 | 从0到1】线程I/O模型
【Java 多线程编程 | 从0到1】线程I/O模型
85 0
|
7月前
|
存储 算法 Java
【Java 多线程编程 | 从0到1】线程机制
【Java 多线程编程 | 从0到1】线程机制
31 0

相关实验场景

更多