在Java中如何设计线程池任务拒绝策略

说实话,Java线程池的拒绝策略确实很让人头疼。
想一想,如果任务跑不起来怎么办? 直接用四招现成的攻略肯定是不够的,还得自己准备足够的温饱。

1 . 四种现成策略,助你认清形势 1 、AbortPolicy(默认)
遇到拒绝就会爆炸,直接抛出异常。
这适用于资金非常宝贵的系统,例如支付系统。
想想看,如果订单无法提交,损失有多大? 2 02 1 年,某电商平台下单超时问题最终被发现是线程池爆炸。
如果使用AbortPolicy的话,瞬间就会爆炸。
2 . DiscardPolicy
如果任务丢失了,直接扔掉,不做任何公告。
这个适合不太重要的场景,比如收集一些日志什么的。
反正丢了就是丢了,反正也没有什么损失。
3 . DiscardOldestPolicy
丢弃团队中最早的任务,重新放置当前的任务。
这适用于任务队列特别繁忙的情况,比如消息队列。
想想看,团队里的旧任务还没有完成,新的任务又来了。
我们先把最旧的扔掉,然后再做这件事。
4 . CallerRunsPolicy
将任务分配给提交任务的线程。
这适合防止系统雪崩,例如高并发API。
想一想,如果线程池处理不了,那就让提交请求的线程自己去做,这样可以缓解压力。

2 写下你自己的拒绝策略 在编写自己的拒绝策略时,必须实现 RejectedExecutionHandler 接口。
关键方法是rejectedExecution。
只需在这里写下您想要执行的操作即可。
之前做项目的时候,写过一个备份队列。
如果任务丢失了,会先放入数据库,等我有空的时候再做。

3 生产环境注意这些 1 . 持续监控
您必须知道自己何时被拒绝。
例如,使用 Prometheus,您可以设置阈值并在超过该阈值时发出警报。
2 02 2 年某个金融体系的崩溃是因为拒绝率没有被监控。
结果线程池满了,系统最终崩溃了。
2 、线程池必须能够自我调整
必须使用可以动态调整的线程池,比如Sentinel,它会根据系统繁忙与否自动调整。
上次使用Sentinel,发现系统繁忙时线程池自动扩容,真是聪明。
3 .定期阅读日志
你必须知道你被拒绝的原因。
例如,如果发现某个任务总是被拒绝,就得检查是否是线程池太小,或者是队列容量不够。

4 如何选择策略 想想这四个步骤: 1 、任务会丢失吗? 您不能直接丢弃 AbortPolicy 或编写自己的备份策略。
2 、想要平滑降级吗? 只是 callerRunsPolicy。
3 .你想做更多的任务吗? 只需丢弃最旧的策略即可。
4 . 剩下的就是DiscardPolicy。

说白了,线程池的拒绝策略就是一种权衡。
想想你的系统可以承受什么,然后选择合适的。
不要盲目选择,否则最后系统会崩溃,你连哭的时间都没有。

线程池创建的四种方法是什么

创建Java线程池有四种方法来动态响应不同的情况。
1 . newCachedThreadPool:动态线程池,适合短期高吞吐量,例如HTTP请求处理。
2 .newFixedThreadPool:固定线程池,稳定加载后台任务,按计划进行数据批量处理。
3 、newSingleThreadExecutor:单线程池,保证顺序执行,比如写入顺序日志。
4 、newScheduledThreadPool:定时任务池,比如心跳检测、定时数据同步等。

注意:为避免默认配置风险,请自定义ThreadPoolExecutor参数并使用shutdown()释放资源。

java newCachedThreadPool 线程池使用在什么情况下

哎,这个java线程池,当时接手一个项目,这四个东西我都搞不明白,卡了好久。

我们来谈谈新的缓存池。
2 01 4 年我在上海的时候,这是一个非常雄心勃勃的项目。
一下子有数百个请求,然后全部消失了。
它非常不稳定。
我用了这个,结果怎么样?系统立刻就卡住了。
检查了很久才发现总是在创建新线程,内存爆了。
想一想,空闲的时候会自己回收,忙的时候不断的打开线程。
如果任务太多,内存会不会爆?
我们来谈谈newFixedThreadPool。
2 01 6 年在北京,我们有一个计划的工作,我们必须确保我们只能同时运行5 个。
最多我们会排队。
这很好用,没问题。
请注意,队列大小必须设置正确,否则作业将积压,系统将无法处理。

newScheduledThreadPool,我接触的比较少。
2 01 8 年,深圳对数据库进行了定期清理。
这工作完美并且没有错误。

最后,新的单线程执行器,是最简单、最优雅的。
2 01 3 年杭州这一年,是一个特别重要的后台任务,应该顺序执行,而不是并行执行。
这就是我用来确保没有错误的方法。
只是不要让它粘住。
如果它被卡住,整个系统就会变慢。
一般来说,这个东西用得好的话,可以省去不少压力,但是如果用错了的话,后果可能会很严重。
应根据实际情况进行选择,不要盲目使用。