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

线上问题:线程池拒绝策略「建议收藏」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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springmvc上传文件过程(c菜鸟教程)

    UploadControllerpackagecom.jege.spring.mvc;importjava.io.File;importjava.io.FileOutputStream;importjava.io.InputStream;importjavax.servlet.http.HttpServletRequest;importorg.apache.co

    2022年4月11日
  • GSLB负载均衡策略

    GSLB负载均衡策略负载均衡策略1.静态策略1)基于特定的用户源IP地址:特定的IP地址段定向到特定的POP节点或者虚拟服务器2)基于加权的IP地址:这里的IP地址是服务池中的虚拟服务器的IP地址.他们的权重不同,这样GSLB在为用户请求轮询解析域名时,根据权重来选择IP3)基于加权的POP节点:基于物理上的节点4)基于地理位置:选择一个在地理位置上与用户距离最近的POP节点或者虚拟服…

    2022年5月18日
  • 怎么强制关闭pycharm_pycharm如何关闭项目

    怎么强制关闭pycharm_pycharm如何关闭项目pycharm的科学模式有时候很烦,如果你用pycharm的时候他会突然闪出来一个界面,提示你开启科学模式,不小心开启了全英文下怎么关闭呐?首先打开这个界面之后发现这里有科学模式按钮,但是这个只是控制单个文件的打开下面的往下拉发现就有了这个内容,打开或者关闭它就行了!…

    2022年8月26日
  • Go 1 – 概览/安装

    Go 1 – 概览/安装安装包下载地址一安装Golang的SDK二配置环境变量三使用命令行调试参考文章地址网上有很多安装方法,比如通过homebrew来安装。这里是直接下载的安装包。安装包下载地址地址:https://golang.org/dl/一、安装Golang的SDK双击.tar文件,就会自动解压成名字为“go”的文件夹;拖拽到你的用户名下,记住路径;我的路径为:/Users/MelissaShu

    2022年10月11日
  • noip2014普及组初赛答案_观光3路公交车路线

    noip2014普及组初赛答案_观光3路公交车路线话说,我终于AC了这个题这是一个贪心,说实话开始做的时候……完全没看出来QAQ。。可能有人说这是个dp,但这真不是(dalao请无视)这真的只是个贪心。。。。首先对于每个点当然是能走就走,不能走就等待,这是无法控制的。所以只考虑氮气加速器加在哪里可以使时间总和尽量少。所以如果选择加速,可能会使后面等待的时间更长,或者更短,对后面都会有影响。但是沿着一条边加速会影响后面的所…

    2022年9月24日
  • ip签名图-论坛签名图片显示ip地址操作系统浏览器等信息,本机ip

    ip签名图-论坛签名图片显示ip地址操作系统浏览器等信息,本机ipip签名图-论坛签名图片显示ip地址浏操作系统浏览器等信息,另:推荐个只显示本机外网ip地址本机ip

    2022年7月3日

发表回复

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

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