为什么调度执行器服务在引发异常后不再次运行任务?
2022-09-01 18:58:40
为了执行周期性任务,我查看了Timer
和SchpendentDThreadPoolExecutor
(使用单个线程),并决定使用后者,因为在Experators.newSingleThreadScheduledExecutor()的参考
中,它说:
但请注意,如果此单个线程由于关闭前的执行期间失败而终止,则如果需要执行后续任务,则将使用新线程取而代之。
我的计划是将此用作保护措施,以防止在要监视其他操作的监视狗代码段中出现未捕获的异常。我想确定并写了下面的测试,很快就失败了。看来我做出了错误的假设,还是我的测试出了问题?
代码如下:
@Test
public void testTimer() {
final AtomicInteger cTries = new AtomicInteger(0);
final AtomicInteger cSuccesses = new AtomicInteger(0);
TimerTask task = new TimerTask() {
@Override
public void run()
{
cTries.incrementAndGet();
if (true) {
throw new RuntimeException();
}
cSuccesses.incrementAndGet();
}
};
/*
Timer t = new Timer();
t.scheduleAtFixedRate(task, 0, 500);
*/
ScheduledExecutorService exe = Executors.newSingleThreadScheduledExecutor();
exe.scheduleAtFixedRate(task, 0, 500, TimeUnit.MILLISECONDS);
synchronized (this) {
try {
wait(3000);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
exe.shutdown();
/*
t.purge();
*/
Assert.assertEquals(cSuccesses.get(), 0);
Assert.assertTrue(cTries.get() > 1, String.format("%d is not greater than 1. :(", cTries.get()));
}