【问题标题】:Java EE WebListener and ThreadJava EE WebListener 和线程
【发布时间】:2012-03-23 02:00:32
【问题描述】:

我有一个标记为 @WebListener 的 servlet。

  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 = 60000(1 分钟)。

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

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

【问题讨论】:

    标签: java multithreading jakarta-ee servlets scheduledexecutorservice


    【解决方案1】:

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

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

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

    如果任务的任何执行遇到异常,后续 处决被压制。否则,任务只会通过 执行人的取消或终止。

    【讨论】:

    • 好的,但是我会知道这个异常是否阻塞了我所有的预定线程。例如,如果我在 run() 方法出现异常后等待一分钟,我的调度程序(schedulerEngine 对象)会重新调度我的批处理?
    • 好的,谢谢。我已经阅读了所有的 javadoc,现在我正试图防止我的代码出现任何异常。
    • 所以听起来除了所有通常的良好实践异常处理之外,对于ScheduledExecutorService,我们还应该在run方法中添加一个包罗万象的try - catch,以防止任何奇怪的异常到达执行者。
    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2011-10-06
    • 2015-04-14
    • 1970-01-01
    • 2010-10-15
    • 2011-10-15
    • 2018-01-08
    相关资源
    最近更新 更多