について質問がありRuntime.getRuntime().addShutdownHook()
ます。
メインで2つのスレッドを開始したとしましょう。両方のスレッドが 1 つのコレクションList<String> commonColection
.
押すCtrl+C
と、このコレクションを保存します。私の質問は、ShutdownHooks が呼び出される前にスレッドが停止しているのか、それともスレッドを明示的に終了してからコレクションを保存する必要があるのかということです。
について質問がありRuntime.getRuntime().addShutdownHook()
ます。
メインで2つのスレッドを開始したとしましょう。両方のスレッドが 1 つのコレクションList<String> commonColection
.
押すCtrl+C
と、このコレクションを保存します。私の質問は、ShutdownHooks が呼び出される前にスレッドが停止しているのか、それともスレッドを明示的に終了してからコレクションを保存する必要があるのかということです。
仮想マシンがシャットダウン シーケンスを開始すると、登録されているすべてのシャットダウン フックが不特定の順序で開始され、同時に実行されます。finalization-on-exit が有効になっている場合、すべてのフックが終了すると、呼び出されていないすべてのファイナライザーが実行されます。最後に、仮想マシンが停止します。
差出人:オラクル・ドキュメント
私がこれを読んだとき、あなたはあなたのスレッドを中止し (ではなく Thread.abort
! 代わりに何らかの手段を使ってそれらを適切に終了させてください!)、あなたのコレクションを保存する必要があります. 少なくとも、コレクションの適切な状態を保存していることを確認する必要があります。
スレッドが「無限」ではなく、デーモンがない場合は、スレッドを終了させることができます。ただし、シャットダウンフックはすぐに戻るはずなので、これはお勧めしません。
あなたから、shutdownHook()
停止するようにシグナルを送ることで、スレッドを正常に終了させることができます。それ以外の場合、スレッドがdaemon threads
の場合、JVM はスレッドが終了するのを待ちません。shutdownHook()
ctrl+c を押すと、呼び出し後に終了します。デーモン スレッドの動作については、この javadoc を参照してください。