【线程池】ScheduledThreadPool异常处理

探讨了ScheduledThreadPool在遇到异常任务时的处理机制,分析了一个因数据合规校验缺失导致任务挂起的问题案例,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

某个任务类负责定时处理一些抽取数据的逻辑,通过定时线程池来实现。

问题

这天发现数据没有被处理,初步检查后定位到是因为放到线程池的这个任务并没有执行,而其他任务却可以正常地执行。

分析

梳理该任务的代码逻辑,其中因为在处理数据的过程中遗漏了对数据的合规校验,而正是因为这次残缺的数据而导致代码抛出异常。

通过查找资料和demo测试,发现ScheduledThreadPool这个定时线程池对抛出异常的任务会进行挂起,此后不会再进行调用。

解决

在任务中对任务进行合规校验

可对不可避免的异常进行捕获,避免异常被抛到任务外

测试

public class ScheduledThreadPoolTest {

    public static void main(String[] args) {

        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);

        scheduledExecutorService.scheduleAtFixedRate(() -> System.out.println("A"), 0, 2, TimeUnit.SECONDS);
        
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("B");
            throw new RuntimeException();
        }, 0, 2, TimeUnit.SECONDS);
        
        scheduledExecutorService.scheduleAtFixedRate(() -> System.out.println("C"), 0, 2, TimeUnit.SECONDS);
    }
}

运行结果

A
B
C
A
C
A
C
...

这里可以看到B任务抛出异常后,线程池不会再进行调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值