ScheduledExecutorService的坑

2023-10-07 18:04

本文主要是介绍ScheduledExecutorService的坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文献

调度服务 ScheduledExecutorService 经常卡顿问题的排查及解决方法-腾讯云开发者社区-腾讯云

场景

        一个安顿广播程序使用的ScheduledExecutorService来定时执行任务,当有一个任务出现异常后就会卡住,不会继续执行后续的任务。

解决方案

查找定时运行的代码,捕获异常,当遇到错误时不影响后续任务执行。

/*** 样例代码
*/
private final ScheduledExecutorService es = Executors.newScheduledThreadPool(1);public void execute(AndonCallService andonCallService) {//10ms执行一次es.scheduleWithFixedDelay(() -> {andonCallService.andonCall();}, 0, 100, TimeUnit.MILLISECONDS);}

查看上面样例中使用的scheduleWithFixedDelay方法

源码注释中有这么一句:If any execution of the task encounters an exception, subsequent executions are suppressed.

翻译过来的意思就是:如果任务的任何执行遇到异常,则会抑制后续执行。

所以如果样例代码中andonCallService.andonCall();抛出任何异常就会导致任务卡住。

优化后代码

/*** 样例代码
*/
private final ScheduledExecutorService es = Executors.newScheduledThreadPool(1);public void execute(AndonCallService andonCallService) {//10ms执行一次es.scheduleWithFixedDelay(() -> {try{//新增异常处理andonCallService.andonCall();}catch (Exception e){log.error("执行调度任务发生异常,忽略此任务:{}", e.getMessage());}}, 0, 100, TimeUnit.MILLISECONDS);}

这篇关于ScheduledExecutorService的坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/159503

相关文章

【学习总结】SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习)

最近在学习若依这个开源项目,发现他记录登录日志的时候使用了异步线程去记录日志,觉得这个方案也挺不错的,在此学习记录下来,以后在工作中也能提供一种思路,其他小伙伴如果有觉得不错的方案也可以在评论区里留言,大家一起探讨一下🍭  若依源码 一、相关工具类 我们一步步看,先把相关的工具类代码给大家贴出来 1、Threads工具类 /*** 线程相关工具类.* * @author ru

Java并发系列 ScheduledExecutorService 使用

本文介绍 ScheduledExecutorService 在Java1.5以后才出现的定时任务的,在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。定时任务在1.5之前是使用 Timer 来实现的,但由于 Timer 有一些问题: Timer对调度的支持是基于绝对时间,而不是相对时间的, 由此任务对系统时钟的改变是敏感的;Scheduled

ScheduledExecutorService详解

文章目录 基础定义主要特点schedule延迟不循环scheduleAtFixedRate延迟且循环scheduleWithFixedDelay严格延迟且循环取消特定定时任务 基础定义 ScheduledExecutorService是Java并发包中提供的一个接口,用于执行定时任务。它继承自ExecutorService接口,并提供了额外的方法来安排和控制定时任务的执行。Sc

消息生产者端使用 ScheduledExecutorService 来定期重置计数器,以实现限流

使用 ScheduledExecutorService 可以很容易地实现定时任务,比如每秒重置计数器来实现限流。下面是一个改进的示例,展示了如何在消息生产者端使用 ScheduledExecutorService 来定期重置计数器,以实现限流: java import org.apache.rocketmq.client.producer.DefaultMQProducer; import or

ScheduledExecutorService scheduleAtFixedRate抛出异常后定时任务不会再执行源码分析

ScheduledExecutorService有时会被用来实现本地的定期任务执行,常规使用方式如下所示: scheduledExecutorService.scheduleAtFixedRate(() -> {System.out.println("执行调度");Integer a = null;a.toString();System.out.println("调度结束");

使用ScheduledExecutorService 代替Timer的好处

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors返回的线程池对象的弊端如下: 1)FixedThreadPool和SingleThreadPool:   允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。 2

用ScheduledExecutorService接口,Quartz框架等创建定时任务

【点我-这里送书】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰哦) 用ScheduledExecutorService接口,Quartz框架

Java 并发专题 Timer的缺陷 用ScheduledExecutorService替代

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 继续并发,上篇博客对于ScheduledThreadPoolExecutor没有进行介绍,说过会和Timer一直单独写一篇Blog. 1、Timer管理延时任务的缺陷 a、以前在项目中也经常使用定

ScheduledExecutorService出现异常挂掉的问题

导语: 最近遇到一个问题,有个周期给业务方推送信息的功能,突然就没推送了。日志里面也没有查询到报错的信息, 然后检查代码发现原来写这个推送功能用的是ScheduledExecutorService,再设定好执行时间,就会周期性去用 ScheduledExecutorService的子线程来执行任务。 问题排查: 问题的原因最后发现是某些配置修改了,导致运行推送任务的子线程在执行的时候回抛出异