говорит, что смысл создания нового потока состоит в том, чтобы позволить другим задачам продолжить работу.
ыполнения периодических заданий я посмотрел наTimer
а такжеScheduledThreadPoolExecutor
(с одной нитью) и решил использовать последний, потому что вreference for Executors.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()));
}