私は現在、次のようなコードのチャンクをリファクタリングしています。
public static void main(String... args) {
while (true) {
// Do something...
Thread.sleep(300000); // Every 5 minutes
}
}
アイデアは、コードの実行に a を使用したいということScheduledExecutorService
です:
public static void main(String... args) {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Task(...), 0, 5, TimeUnit.MINUTES);
}
ただし、これにはいくつかの懸念があります。まず、main()
スケジューリング後にプログラムが「終了」する (リターンのように) という事実ですが、JVM はScheduledExecutorService
実行されたままであるため、存続します。これは、「外部から終了されるまで実行し続ける」という古いコードの動作を維持するための意図的なものだと思いますが、ScheduledExecutorService
適切にシャットダウンするためにシャットダウン フックをインストールする必要があると思います。それは実際に当てはまりますか、それとも「外部から殺される」ことでシャットダウンフックの実行も妨げられますか?
第二に、私はそもそもシャットダウンフックを持つことについてもきしむ。次のようなコードがあった場合
try {
while (true) {}
} finally {
// Shutdown hook code goes here instead
service.shutdown();
if (!service.awaitTermination(1, TimeUnit.SECONDS)) {
service.shutdownNow();
}
}
上記と同じ「外部から殺される」懸念はまだ存在しますか?
編集: はい、元のプログラムはループを突破することなくループします。たとえば、SIGINT(端末のcontrol-C)から終了することのみを目的としていました。かなり曖昧な終了条件ですが、今はそれしかありません...