为了账号安全,请及时绑定邮箱和手机立即绑定

异常处理 ScheduledExecutorService

异常处理 ScheduledExecutorService

宝慕林4294392 2023-05-10 17:33:21
我正在使用ScheduledExecutorService以固定间隔运行线程1 min。一个实例ScheduledExecutorService运行一个线程,另一个实例运行另一个线程。例子:ses1.scheduleAtFixRate(..) // for thread 1   ses2.scheduleAtFixRate(..) // for thread 2我遇到了一些异常,进一步执行停止。我想捕获系统关闭我的应用程序的异常。我应该使用第三个线程来处理异常,该线程同时监视未来并处理异常,还是有其他更好的方法?会不会影响其他线程。任何帮助表示赞赏!
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

我遇到了一些异常,进一步执行停止。

ScheduledExecutorService.scheduleAtFixRate()这是根据规范的预期行为:

如果任务的任何执行遇到异常,则后续执行将被抑制。

关于您的需求:

我想捕获系统关闭我的应用程序的异常。
我应该使用第三个线程来处理异常,该线程同时监视未来并处理异常,还是有其他更好的方法?

处理未来的回报看起来ScheduledFuture.get()是正确的。根据ScheduledFuture.scheduleAtFixedRate()规格:

否则,任务只会通过取消或终止执行者来终止。

所以你甚至不需要创建一个新的预定未来。
只需运行两个并行任务(ExecutorService也可以使用一个或两个线程),等待get()每个任务Future并在任务中抛出异常时停止应用程序:

Future<?> futureA = ses1.scheduleAtFixRate(..) // for thread 1  

Future<?> futureB = ses2.scheduleAtFixRate(..) // for thread 2

submitAndStopTheApplicationIfFail(futureA);

submitAndStopTheApplicationIfFail(futureB);


public void submitAndStopTheApplicationIfFail(Future<?> future){

      executor.submit(() -> {

      try {

        future.get();

      } catch (InterruptedException e) {

        // stop the application

      } catch (ExecutionException e) {

        // stop the application

      }

    });

}


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信