线上问题:线程池拒绝策略「建议收藏」

线上问题:线程池拒绝策略「建议收藏」1场景复现服务调用时序如图1所示。中间件服务使用线程池ThreadPoolExecutor,配置丢弃策略为DiscardOldestPolicy(丢弃队列中等待最久的任务),队列容量为10。图1服务调用publicstaticExecutorServicethreadPoolExecutorGenerate=newThreadPoolExecutor(ThreadPoolConstant.CORE_THREAD_NUM,Thread

大家好,又见面了,我是你们的朋友全栈君。

1 场景复现

服务调用时序如图1所示。中间件服务使用线程池ThreadPoolExecutor,配置丢弃策略为DiscardOldestPolicy(丢弃队列中等待最久的任务),队列容量为10。
在这里插入图片描述


图1 服务调用

public static ExecutorService threadPoolExecutorGenerate = new ThreadPoolExecutor(
            ThreadPoolConstant.CORE_THREAD_NUM,
            ThreadPoolConstant.MAX_THREAD_NUM,
            ThreadPoolConstant.KEEP_ALIVE_TIME_SECONDS,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(ThreadPoolConstant.QUEUE_LENGTH),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortOldestPolicy());

2 原因

线程池配置丢弃策略为DiscardOldestPolicy(丢弃队列中等待最久的任务),队列容量为10,当队列达到上限时,丢弃任务,此时,后台服务无法获取到中间件丢弃任务的返回值,导致后台服务异常。

3 方案

中间件服务具有特殊性,必须要有返回值以确定当前任务是否正常,因此,使用线程池时,应该使用拒绝策略AbortPolicy,当拒绝任务后,抛出异常,在程序中捕获异常,并返回默认值或约定的值,保证中间件服务不会卡住,后台服务可以及时拿到数据,保证后台服务不会卡住。

3.1 AbortPolicy拒绝策略实现

public static class AbortPolicy implements RejectedExecutionHandler { 
   
        /** * Creates an {@code AbortPolicy}. */
        public AbortPolicy() { 
    }

        /** * Always throws RejectedExecutionException. * * @param r the runnable task requested to be executed * @param e the executor attempting to execute this task * @throws RejectedExecutionException always */
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { 
   
            throw new RejectedExecutionException("Task " + r.toString() +
                                                 " rejected from " +
                                                 e.toString());
        }
    }

3.2 完整配置

 public static ExecutorService threadPoolExecutorGenerate = new ThreadPoolExecutor(
            ThreadPoolConstant.CORE_THREAD_NUM,
            ThreadPoolConstant.MAX_THREAD_NUM,
            ThreadPoolConstant.KEEP_ALIVE_TIME_SECONDS,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(ThreadPoolConstant.QUEUE_LENGTH),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy());

4 小结

线程池策略:

  • 需要及时得到响应的服务,使用拒绝策略,捕获异常,及时返回默认值或约定值
  • 有补偿机制或无序及时处理的,可以使用丢弃策略。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148619.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 查看Linux内核版本_查看ubuntu内核

    查看Linux内核版本_查看ubuntu内核一、查看Linux内核版本命令(两种方法):1、cat/proc/version[root@S-CentOShome]#cat/proc/versionLinuxversion2.6.32-431.el6.x86_64(mockbuild@c6b8.bsys.dev.centos.org)(gccversion4.4.720120313(RedHat4.4.7-4)(GCC))#1SMPFriNov2203:15:09UTC20132、u

    2022年10月13日
  • mybatis多条件查询sql_sql模糊查询多个条件

    mybatis多条件查询sql_sql模糊查询多个条件步骤1:先运行,看到效果,再学习步骤2:模仿和排错步骤3:在前一步的基础上进行步骤4:模糊查询步骤5:多条件查询步骤1:先运行,看到效果,再学习老规矩,先下载下载区(点击进入)的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。步骤2:模仿和排错在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。模仿过程难免代码有出入,导致无法得到…

  • Java的invoke方法[通俗易懂]

    Java的invoke方法[通俗易懂]如果读一些Java或者相关框架的源码,实际上一定会经常出现invoke方法的调用,在自己或者团队封装框架时,如果有时候弄得不好经常也会报invoke相关的错。invoke方法是干什么的?有什么具体用途?首先要了解invoke方法干什么的以及具体用途,实际你要搞清他在源码那个class文件上,他在那个包里,追根溯源。invoke方法来自Method类,可能不会像我们经常用到的基础类型包装类,以及集合类还有他们的扩展和工具类使用的那么多。但是Method类所在的包可是大名鼎鼎的反射Reflact,不是有

  • OOXML,XLSX分析

    OOXML,XLSX分析07以上的xlsx是使用了OOXML和zip,将后缀修改为.zip,就可以看到文件,主要分析xl目录下的文件,如图:主要数据文件在xl目录下面styles.xml里面存放着excel的样式数据很

  • mac安装wget命令_安装mac系统

    mac安装wget命令_安装mac系统wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理。“wget”这个名称来源于“WorldWideWeb”与“get”的结合。所谓自动下载,是指wget可以在用户退出系统的之后在继续后台执行,直到下载任务完成。Mac安装wget官网下载包wget1.8.tar.gz包:http://ftp.gnu.org/gnu/wget/解压到想安装的路径打开终端进入wget解压的路径依次执

    2022年10月16日
  • CefSharp For WPF隐藏滚动条

    CefSharp For WPF隐藏滚动条

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号