成熟的线程要懂得拒绝

举报
西魏陶渊明 发表于 2022/09/25 02:34:12 2022/09/25
【摘要】 作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ 西魏陶渊明 莫笑少年江湖梦,谁不少年梦江湖 拒绝策略 拒绝策略就是任务实在是已经执行不了,那么就需...

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

西魏陶渊明
莫笑少年江湖梦,谁不少年梦江湖

拒绝策略

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

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

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

  
 
  • 1
  • 2
  • 3

四种拒绝策略

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

1. CallerRunsPolicy

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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());
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3. DiscardPolicy

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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);
            }
        }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

分析

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

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

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/125824205

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。