ThreadPoolTaskExecutor 如果线程池默认的queue满了,会触发什么异常

news/2024/10/10 2:10:06

Spring 中,使用 ThreadPoolTaskExecutor 时,如果线程池中的 任务队列(Queue) 满了,默认情况下并不会直接抛出异常,而是会根据 RejectedExecutionHandler 的策略来决定如何处理被拒绝的任务。ThreadPoolTaskExecutor 继承自 Java 的 ThreadPoolExecutor,因此它使用了 ThreadPoolExecutor 中定义的拒绝策略来处理这种情况。

RejectedExecutionHandler 的默认策略

ThreadPoolTaskExecutor 使用的底层实现是 ThreadPoolExecutor,它有四种处理拒绝任务的策略,默认情况下使用的是 AbortPolicy。当任务队列满时,会触发 java.util.concurrent.RejectedExecutionException 异常。以下是 ThreadPoolExecutor 支持的四种策略:

  1. AbortPolicy(默认):当任务无法被提交到线程池时,会抛出 RejectedExecutionException
  2. CallerRunsPolicy:当任务无法被提交时,调用该任务的线程(提交任务的线程)会直接运行这个任务。这可能会影响应用程序的性能,因为原本用于提交任务的线程现在正在执行任务。
  3. DiscardPolicy:直接丢弃新提交的任务,不抛出异常。
  4. DiscardOldestPolicy:丢弃队列中最早提交但尚未被执行的任务,然后重新尝试提交当前任务。

默认的处理行为

如果 ThreadPoolTaskExecutor 没有设置自定义的拒绝策略,默认会使用 AbortPolicy,也就是说,当任务队列满了之后,会抛出 RejectedExecutionException。这个异常表明线程池已经无法再接受新的任务,因为工作线程都已占用且队列已满。

自定义拒绝策略

如果不想让任务在队列满的时候直接抛出异常,您可以自定义 ThreadPoolTaskExecutor 的拒绝策略。可以通过 setRejectedExecutionHandler() 方法来指定不同的策略。

例如:

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();

这段代码将 CallerRunsPolicy 设置为拒绝策略,当队列满时,提交任务的线程会执行该任务而不是抛出异常。

结论

ThreadPoolTaskExecutor 中,如果线程池的任务队列满了,默认情况下会抛出 RejectedExecutionException,这是由于使用了默认的 AbortPolicy。您可以根据需要自定义拒绝策略以避免异常或选择其他处理方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/69647.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

两台iStoreOS路由器通过wireguard实现异地组网

一、前言 我在家中和单位宿舍申请了两条联通千兆宽带,每条均有公网ip,如何实现更多玩法呢?最近折腾了一下异地组网,这里简单记录一下 环境:路由器A,内网ip为192.168.1.1,系统为iStoreOS, 路由器B,内网ip为192.168.0.1,系统和版本号同上 至少有一条具有公网ip的宽带,…

1panel搭建frp服务端并使用openresty反向代理实现https访问

前言 这次国庆节回老家发现家里的路由器居然是我去年带过去的斐讯K2p,已经刷了openwrt,于是想着有没有更多玩法?因为家里的宽带是移动宽带,没有公网IP,所以来折腾一下frp内网穿透。 我想实现的目标是:通过不同的三级域名,来访问不同的服务。例如,访问https://op.frp.xx…

004、v3admin学习,使用ci4搭建后端服务器

1、按照php环境和composer,输入cmd的composer命令,版本是2.7.9 2、在工作目录,输入命令行composer create-project codeigniter4/appstarter ci4 ,会全自动创建工程 3、把composer下来的文件,拷贝到外面工程中。 4、用phpstorm打开工程,更新一下依赖包 5、用小皮桌面开启p…

UNRAID下安装Virtual DSM

本文基于【完结】Virtual DSM 逆向笔记 (基于libvirt的安装及升级) (jxcn.org) 感谢chk-jxcn的分享! 一、安装镜像的准备 链接:https://pan.baidu.com/s/16I89NHPTW6TDx7ACh67yiA 提取码:7hkq 下载下来的镜像是原作者chk-jxcn(jxcn.org)从 DSM 中提取出的 VDSM 7.0 的安装镜…

house_of_muney [2023CISCN]

house_of_muney 首先介绍一下house of muney 这个利用原理: 在了解过_dl_runtime_resolve的前提下,当程序保护开了延迟绑定的时候,程序第一次调用相关函数的时候会执行下面的命令 push n push ModuleID jmp _dl_runtime_resolve 这里的n对应的是这个符号在rel.plt重定位表中…

C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式

分享删除字符串最后一个字符的多种实现方法,包括字符串、StringBuilder、Array、Linq等方式,并进行性能测试。结果显示字符串方式性能最优,但了解多种方法有助于选择最合适的方法。今天想通过和大家分享如何删除字符串最后一个字符的N种实现方法,来回顾一些基础知识点。 01…

NET Core 基础 - 删除字符串最后一个字符的七大类N种实现方式

分享删除字符串最后一个字符的多种实现方法,包括字符串、StringBuilder、Array、Linq等方式,并进行性能测试。结果显示字符串方式性能最优,但了解多种方法有助于选择最合适的方法。今天想通过和大家分享如何删除字符串最后一个字符的N种实现方法,来回顾一些基础知识点。 01…

003、v3admin学习,修改全局配置如去掉水印等

1、v3admin打开之后的界面如下 2、修改一下全局通用设置 3、界面如下 4、把app.vue中的这一段注释掉 5、浏览器也就没有弹窗显示了。