@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