2

我有一个 servlet 标记为@WebListener.

  public void contextInitialized(ServletContextEvent event) {                
        schedulerEngine = Executors.newSingleThreadScheduledExecutor();
        schedulerEngine.scheduleAtFixedRate(new Batch1(), 0, MILLISECONDS_ITERATE_PA, TimeUnit.MILLISECONDS);
        schedulerEngine.scheduleAtFixedRate(new Batch2(), 0, MILLISECONDS_ITERATE_IAS, TimeUnit.MILLISECONDS);
        schedulerEngine.scheduleAtFixedRate(new Batch3(), 0, MILLISECONDS_ITERATE_EV1, TimeUnit.MILLISECONDS);
        schedulerEngine.scheduleAtFixedRate(new Batch4(), 0, MILLISECONDS_ITERATE_MV1, TimeUnit.MILLISECONDS);
        schedulerEngine.scheduleAtFixedRate(new Batch5(), 0, MILLISECONDS_ITERATE_BB, TimeUnit.MILLISECONDS);
        schedulerEngine.scheduleAtFixedRate(new Batch6(), 0, MILLISECONDS_ITERATE_EV, TimeUnit.MILLISECONDS);
    }

public class BatchX implements Runnable {
        @Override
        public void run() {
         ....
        }
}

MILLISECONDS_ITERATE_XX = 600001 分钟)。

是否有可能某些线程因内存问题而自行停止?

如果在我的BatchX()运行方法中出现异常(例如NullPointerException),线程会永远停止吗?

4

1 回答 1

1

代码块总是有可能被异常中断。这是否致命取决于您采取哪些措施来预防或从中恢复:

  1. 对于已检查的异常,例如IOException,您需要将一些恢复和/或日志记录代码放入您的 catch 块中,然后决定您是否希望退出该方法或继续执行。
  2. 在未经检查的异常的情况下,例如NullPointerException最好防止它们,而不是捕获它们,例如通过确保在您尝试访问它时没有对象可以为空,或者在迭代时没有索引可能超过数组的边界等.

编辑:为了回答您的特定问题,Javadoc说:

如果任务的任何执行遇到异常,则后续执行将被抑制。否则,任务只会通过取消或终止执行者来终止。

于 2012-03-05T15:57:20.180 回答