定期実行し続けるScheduledFuture
のFuture#get
てどのように使うのだろうか? という疑問が生じた。なので試してみた。
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
AtomicInteger c = new AtomicInteger(0);
ScheduledFuture<?> future = scheduler.scheduleAtFixedRate(() -> {
System.out.println(c);
if (c.get() > 3) {
throw new RuntimeException();
}
c.incrementAndGet();
}, 0, 500, TimeUnit.MILLISECONDS);
try {
future.get();
} catch (ExecutionException ex) {
System.out.println("finished.");
}
これを実行すると下記のような実行結果になる。
0
1
2
3
4
finished.
定期実行サービスのスレッドで例外をスローすると、future#get
はExecutionException
スローする。なのでこれをcatchしてメッセージを出力している。
というわけで、定期実行サービスをwatchして失敗したら何らかの後処理を行いたい、という場合に使える。とはいっても、定期実行でそういうユースケースはあまり思いつかない。Future#cancel
で停止したいことはあるだろうけど。