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

线上问题:线程池拒绝策略「建议收藏」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 小结

线程池策略:

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • awstats安装流程「建议收藏」

    awstats安装流程「建议收藏」我是直接从网站上下的rpm,然后rpm-ivh的然后直接安装到/usr/local/awstatsapache日志格式要使用combined:CustomLog"/var/log/httpd/access_log"combined我是用的logrotate每天断日志,然后将以前的日志打包成gz存放,于是昨天的日志就是access_log.1.gz添加主机(可以…

    2022年7月16日
  • lldp协议代码阅读_LLDP(lldp协议平时开启还是关闭)

    lldp协议代码阅读_LLDP(lldp协议平时开启还是关闭)没设备,没法试试ndp,不知道disndp是什么效果,和dislldp。有什么区别呢。NDP是邻居发现协议,他也是通过HELLO包机制发现邻居,DISNDP可以看到和它互联的同品牌设备的基本信息以及互联端口。你好!应该是LLDPE产品吧,是线性低密度聚乙烯,主要用来做滚塑产品的我的回答你还满意吗~~不兼容,lldp是lldp,cdp是cdp,现在cisco的设备一般都能支持lldp,lld…

    2022年6月2日
  • unix命令大全详解-完整版_command方式:

    unix命令大全详解-完整版_command方式:UNIX命令大全详解-完整版command方式:任何输入都会作为编辑命令,而不会出现在屏幕上,若输入错误则有“岬”的声音;任何输入都引起立即反映insert方式:任何输入的数据都置于编辑寄存器。在command方式下输入(I,a,A等),可进入in

    2022年5月6日
  • 下载Android SDK tools完成Android SDK 安装、配置环境变量

    下载Android SDK tools完成Android SDK 安装、配置环境变量大家都知道安卓是基于java开发的,安卓因为其开放包容的特性被广大的程序员所青睐。早期,开发Android用到IDE是开源的eclipse,同时Android为eclipse提供了开发用的插件,这促使了安卓的发展。随着Android的过于开放,导致Android吃硬件性能越来越厉害。现在,为了解决性能上面的缺陷,Google慢慢的开始收紧了对Android的控制。于是Google研发了自家的AndroidStudio。随着时间的发展,AndroidStudio越来越成熟。

    2022年7月21日
  • vuex mapGetters「建议收藏」

    vuex mapGetters「建议收藏」1、vuex配置//vuex的配置//注意Store是大写conststore=newVuex.Store({//数据保存state:{show:false,count:…

    2022年6月8日
  • mac版pycharm使用方法_电脑管家mac版是什么意思

    mac版pycharm使用方法_电脑管家mac版是什么意思自定义模版在头部自动生成项目名称、文件所属作者、生成时间参数模版。File–>PreferencesforNewProject–>Editor–>FileandCodeTemplates–>PythonScript–>编辑完后点Apply–>OK#!/usr/bin/envpython#-*-coding…

    2022年8月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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