监视并重新启动Executor服务和未来任务?

时间:2011-09-07 10:28:16

标签: java multithreading

我正在 Java 5 中开发一个多线程应用程序。当它执行时,它启动了几个执行程序服务,它必须运行很长时间。我有一个监视服务,可以检查每个创建的执行程序的状态。我已经读过执行服务可能只有以下状态:

  
      
  • 跑步,
  •   
  • 关闭和
  •   
  • 终止。
  •   

如果在执行过程中发生任何奇怪的事情, 我已经将我自己的 FutureTask 类子类化并覆盖了方法:

  • setException
  • 完成(任何异常,如ExecutionException和 InterruptedException在这里是谨慎的)

我遇到一个Executor服务抛出ExecutionException(在我自己的FutureTask类中)的情况。捕获并记录ExecutionException,但我的执行程序服务不再登录任何内容。我的监视器服务正在输出执行程序服务仍处于活动状态。 也许这与我的FutureTask达到完成状态的事实有关?

  
      
  1. 管理此问题的最佳方法是什么?
  2.   
  3. 是否可以重新启动执行程序服务?
  4.   
  5. 看起来FutureTask状态会影响Executor服务,我可以使用FutureTask的状态来了解Executor服务的状态。
  6.   

感谢您的帮助,

1 个答案:

答案 0 :(得分:1)

通常,处理异常最好由任务本身完成。如果您的任务抛出异常,即使它是一个计划任务(它也不会再次运行),它也会完成。事实上,如果在任务完成后你想要完成任何工作,它通常最好由任务中的同一个线程完成。即只有在几乎没有什么可做的情况下才会返回。

编辑:为防止重复出现的任务死亡,您可以使用try / catch块。

Runnable run = new Runnable() {
    public void run() {
        try {
           // do something which might throw an Exception
        } catch(Exception e) {
           log.error(e);
        }
    }
};
scheduledExecutorService.scheduleAtFixedRate(run, delay, period, unit);

如果您没有捕获异常并将其记录下来,它将被存储在FutureTask中,您必须记住将其记录在那里并重新启动任务,记住他经常执行任务的频率。

BTW:任务不会影响ExecutorService的状态,除非有一个引用直接调用它。 (它不会意外发生)

BTW2:随着Java 7的发布,在Java 6发布五年多之后,它还有时间考虑从Java 5.0迁移已经停产超过三年了。