我正在 Java 5 中开发一个多线程应用程序。当它执行时,它启动了几个执行程序服务,它必须运行很长时间。我有一个监视服务,可以检查每个创建的执行程序的状态。我已经读过执行服务可能只有以下状态:
- 跑步,
- 关闭和
- 终止。
如果在执行过程中发生任何奇怪的事情, 我已经将我自己的 FutureTask 类子类化并覆盖了方法:
我遇到一个Executor服务抛出ExecutionException(在我自己的FutureTask类中)的情况。捕获并记录ExecutionException,但我的执行程序服务不再登录任何内容。我的监视器服务正在输出执行程序服务仍处于活动状态。 也许这与我的FutureTask达到完成状态的事实有关?
- 管理此问题的最佳方法是什么?
- 是否可以重新启动执行程序服务?
- 看起来FutureTask状态会影响Executor服务,我可以使用FutureTask的状态来了解Executor服务的状态。
醇>
感谢您的帮助,
答案 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迁移已经停产超过三年了。