震惊!!!一个异常居然导致线程池中的线程death

@desc:
业务场景是需要两个定时线程,定时取modbus中查询气体信息;A线程为取值线程,B线程为信息维护;
问题:A线程death
private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
// 初始化定时线程,1s从Modbus设备读取一次信息
        scheduledExecutorService.scheduleWithFixedDelay(() -> {
            if (isRunning.get()) {
                synchronized (lock) {
                    try{
                        queryAmbientMasterList();
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }, 1000, 500, TimeUnit.MILLISECONDS);
        // 初始化定时线程,10s查询一次环境信息是否更新
        scheduledExecutorService.scheduleWithFixedDelay(() -> {
            if (isRunning.get()) {
                synchronized (lock) {
                    try{
                        // 检查气体设备信息变更
                        checkAmbientMasterInfoChange();
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }, 5, 1, TimeUnit.SECONDS);
解决:
lambda方程中加入try-catch

原因:线程池中会自己捕获异常,不会抛出,出现异常就会阻塞当前线程
参考 cnblogs.com/wang-meng/p/10588637.html
https://blog.csdn.net/u011635492/article/details/80328815
posted @ 2022-03-14 11:12  南有乔木不可修思  阅读(65)  评论(0)    收藏  举报