线程池的自定义策略

需求背景

有一个上传任务,文件大概有数万,上传后发现有部分文件数据异常,查看日志发现有部分文件的异步事件未调用,所以猜测是否是调用的异步事件比较多,线程池阻塞队列满了。

思考

想着自定义线程池策略
线程池的四种拒绝策略就不细说了,大概查看了一下,发现他们的代码其实都很简单,都是实现了RejectedExecutionHandler接口,然后重写了rejectedExecution方法,在这个方法中做了一些处理。
四种里有三种是直接抛弃任务的,只有一种是主线程去执行被拒绝的任务,但是这种方法也会导致哪怕线程池空闲了,任务还是会依赖主线程。
默认的策略是抛弃报异常,其实我觉得这个策略就是正确的,因为如果出现了线程超过了线程池负载,本身就是一种异常了,不能忽视,确实要抛出来,考虑优化代码逻辑还是升级机器,而不是再简单的加个阻塞队列。

解决

现在的需要的无非是在抛异常的时候打印一些异常日志,并且能够记录下来以便我们分析。
所以参考了 Dubbo源码:AbortPolicyWithReport,发现它的在处理办法就是,继承了AbortPolicy,在抛异常之间打日志+持久化堆栈信息+发送事件

猜你喜欢

转载自blog.csdn.net/qq_31363843/article/details/126369929
今日推荐