如果发生异常,如何重新启动计划的线程?

时间:2015-06-18 21:40:20

标签: java multithreading

我正在运行一个计划使用ScheduledExecutorService每10毫秒运行一次的线程。有时线程因随机未捕获异常而失败,我想知道如何在发生这种情况时重新启动线程。我试图使线程全局化,并使用另一个调度线程检查线程是否处于活动状态,但即使它正在运行,它也始终返回false。我还试图检查全局线程的状态,但总是返回“NEW”。任何帮助将非常感激! 以下是初始化所有内容的代码:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);
Thread update = new Thread(new UpdateThread());
scheduler.scheduleAtFixedRate(update, 0, 10, TimeUnit.MILLISECONDS);

1 个答案:

答案 0 :(得分:5)

无论您运行到ExecutorService的任何可运行的东西,都应将其主体放在try{} catch (RuntimeException) {/*log it*/}块中。 ScheduledExecutorService.scheduleAtFixedRate的Javadoc明确表示如果调度的Runnable抛出异常,则将来的执行被禁止。

如果由于某种原因你不想用try / catch包裹身体 - 你可以使用ScheduledFuture返回的scheduleAtFixedRate;根据我的快速测试,在ScheduledFuture上调用get将阻塞,直到任务执行失败并发生未捕获的异常。

顺便说一句 - 你通常不应该将Thread传递给ExecutorService;该服务只需Runnable,并在内部创建自己的Thread