7

シャットダウンフックにスイングを追加する(つまり、VMのシャットダウン時にポップアップを表示する)方法はありますか?

新しいJFrameを作成しようとすると、シャットダウンフックを登録しようとするため、エラーが発生します。これは、VMがすでにシャットダウンしているため失敗します。私はこれを回避する方法が実際にあるかどうか疑問に思っています

4

5 に答える 5

14

あなたは本当にこれをするべきではありません。仕様から:_Runtime.addShutdownHook

Java仮想マシンは、次の2種類のイベントに応答してシャットダウンします。

  • プログラムは、デーモン以外の最後のスレッドが終了したとき、またはexit(同等にSystem.exit)メソッドが呼び出されたとき、または
  • 仮想マシンは、入力などのユーザー割り込み、またはユーザーログオフやシステムシャットダウンなどのシステム全体のイベントに応答して終了します。^C

..。

シャットダウンフックは、仮想マシンのライフサイクルの微妙なタイミングで実行されるため、防御的にコーディングする必要があります。特に、スレッドセーフであり、可能な限りデッドロックを回避するように作成する必要があります。また、独自のシャットダウンフックを登録している可能性があるため、シャットダウンの過程にある可能性のあるサービスに盲目的に依存するべきではありません。たとえば、AWTイベントディスパッチスレッドなどの他のスレッドベースのサービスを使用しようとすると、デッドロックが発生する可能性があります。

シャットダウンフックもすぐに作業を終了する必要があります。プログラムが呼び出さexitれると、仮想マシンはすぐにシャットダウンして終了することが期待されます。ユーザーのログオフまたはシステムのシャットダウンが原因で仮想マシンが終了した場合、基盤となるオペレーティングシステムは、シャットダウンして終了するための一定の時間しか許可しない場合があります。したがって、ユーザーとの対話を試みたり、シャットダウンフックで長時間実行される計算を実行したりすることはお勧めできません。

..。

まれに、仮想マシンが異常終了する場合があります。つまり、正常にシャットダウンせずに実行を停止する場合があります。これは、仮想マシンが外部で終了した場合に発生します。たとえば、SIGKILLUnixのシグナルやTerminateProcessMicrosoftWindowsの呼び出しなどです。また、内部データ構造が破損したり、存在しないメモリにアクセスしようとしたりして、ネイティブメソッドが失敗した場合にも、仮想マシンが異常終了する可能性があります。仮想マシンが異常終了した場合、シャットダウンフックが実行されるかどうかについて保証することはできません。

これを行わないことを示唆するここでの特定の警告:

  1. 「シャットダウンフックも、作業をすばやく完了する必要があります。」

    作業に時間がかかる可能性のあるものに依存したりJOptionPane、ダイアログなどのユーザー入力を無期限にブロックしたりすることは、シャットダウンフックで行うべきことではありません。

  2. 「たとえば、AWTイベントディスパッチスレッドなどの他のスレッドベースのサービスを使用しようとすると、デッドロックが発生する可能性があります。」

    SwingはAWT上で実行され、その基になるイベントディスパッチスレッドもシャットダウン中の可能性があります。シャットダウン中にSwingまたはAWTを使用しようとすると、デッドロックが発生するだけでなく、とにかくまったく機能しない可能性があります。

  3. 「仮想マシンが異常終了した場合、シャットダウンフックが実行されるかどうかについて保証することはできません。」

    シャットダウンフックは、停止または中止されたときではなく、正常に終了または終了したときにのみ実行されることが保証されているため、ユーザーがメッセージを受け取る可能性さえあるという保証はありません。

于 2012-08-25T08:18:47.423 に答える
4

シャットダウンフックは、可能な限り迅速に実行されることになっています。これには、ユーザーがダイアログを確認するのを待つことは含まれません。いずれの場合も、Swingイベントスレッドがまだ実行されているという保証はありません。

あなたはこれを行うことはできません。

于 2012-08-25T08:18:08.160 に答える
2
  1. Swing GUIは、イベントディスパッチスレッドで実行する必要があります。

  2. 簡単な方法ですが、エンドユーザーのアクションが必要です(閉じるJDialog

于 2012-08-25T07:30:13.637 に答える
2

ある場合、それはあなたを助けません。

シャットダウンフックはJVMシャットダウンの一部として非同期的に呼び出されるため、シャットダウンプロセスを停止または元に戻すことはできないため、「確認」ダイアログでは実際には何も確認されません。ユーザーが決定を下すのを待つことは、シャットダウンフックが意図されている種類のアクションではありません。対話型プログラムのシャットダウンフックは意味がありません。シャットダウンフックの実際の使用例は次のとおりです。

JVMのシャットダウン時にリソースやその他のハウスキーピングを解放するため

シャットダウンフックが常に実行されるとは限らないことに注意することも重要です。詳細については、ここで私の答えを参照してください:C#1からJavaアプリケーションを正しくシャットダウンする方法

于 2012-08-25T08:06:48.837 に答える
-1

あなたの質問についてはよくわかりませんが、JVMのシャットダウン時にポップアップウィンドウを実行または表示することは不可能だと思います。寝る準備をしながら走ろうとしているようなものですか?ただ推測します。:)

于 2012-08-25T08:09:58.883 に答える