【问题标题】:Check scheduled tasks status检查计划任务状态
【发布时间】:2016-07-20 03:54:32
【问题描述】:

我有一个使用ScheduledExecutorService 处理多个Runnable 的应用程序:每个Runnable 都以固定速率进行调度,并且必须只要应用程序处于活动状态。

如果这些线程中的任何一个因某些异常而终止,我需要一个解决方案来得到通知,以便我可以再次安排它们。

我可以使用任何模式来解决这个问题吗?还是我在应用程序中使用了错误的对象?

【问题讨论】:

标签: java multithreading executorservice scheduledexecutorservice


【解决方案1】:

如果您简单地包装 Runnable 可能会更容易,这样异常就不会导致任务被取消:

class CatchingRunnable implements Runnable {
  private final Runnable delegate;

  CatchingRunnable(Runnable delegate) {
    this.delegate = delegate;
  }

  @Override public void run() {
    try {
      delegate.run();
    } catch (RuntimeException e) {
      // Handle the exception somehow, e.g. log it.
    }
  }
}

现在安排runnable通过:

executor.scheduleAtFixedRate(new CatchingRunnable(runnable), delay, period, unit);

那么您就不必担心重新安排它们了。

【讨论】:

  • 这很好,但可能很难预测您可能遇到的任何类型的异常并相应地处理它。建议:从catch 块中,回调有执行器的类,重新调度。要做到这一点,你可能会有另一个接口而不是delegateRunnable,它也有一个函数(例如recreate())来重新创建相同的委托。
  • @JornVernee 好吧,当然,您可能希望以特定方式处理特定异常。但是 1)您将如何通过其他方式处理那些“不可知的”异常? 2)如果你的目标是“如果失败,重新启动”,异常的类型无关紧要。
  • 是的,我的观点是第 2 点,异常的类型无关紧要。建议是如果可运行程序因异常终止,则自行重新安排。就是这样。
【解决方案2】:

如果 ScheduleFuture 完成,您也可以维护一个处理程序以重新提交。

【讨论】:

    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多