addShutdownHook()を使用してCtrl + Cを処理するSwingアプリケーションがあります。通常の状況でJLabelテキストを変更する関数それがぶら下がります。JVMがシャットダウンしていることの検出
私は、スイングEDTが終了したか何かを待っているという問題があると想定します。
EDTが終了したか、または「完了」している(Swingメソッドの呼び出しを避けることができる)か、Ctrl-Cで通常のウィンドウを閉じるような動作を防ぐ方法がありますか? ?
を私はstop()
と呼ばれるクラスのメソッドを持っている:だけ明確にする
。通常の状況下では、これは(補足start()
とともに)呼び出され、stop()
が発生したという視覚的なフィードバックのために、JLabelを更新する原因となるカスケードをトリガーします。
私のシャットダウンフックが実行されるとき、いくつかのリソースを正常にシャットダウンするには、stop()
に電話する必要があります。
私はSwing EDTがないことを検出することができるので、stop()
を書き換えて、Swingの不足を検出し、Swing機能への呼び出しを回避できるようにします。
これは時間のいくつかの動作します。しかし、それはまだ物事が停止される順序に依存しています。スレッドがシャットダウンする順序やシャットダウンフックが開始される順序を制御することはできないため、ロックアップの原因となったイベントの順序は引き続き発生します。(1)Ctrl + CによりJVMがシャットダウンを開始します。 Swingスレッドが閉じられ、あなたのシャットダウンフックがまだ呼び出されていない、(3)JLabelが変更を要求する呼び出しが呼び出された、アプリケーションがハングアップする、(4)シャットダウンフックが呼び出される、無効/ロックアップコールを防止します。 – jefflunt
@normalocity:少なくともこの問題の文脈では、それを心配しないでください。あなたが記述しているようなシーケンス(2)、(3)が発生した場合、それは対処する必要がある別の問題です。シャットダウンフックを使用していなくても発生します。 –
まあ、あなたのコードがうまくいけばうれしいです。あなたは結局、あなた自身のコードのエンジニアなので、心配しなければ、心配する必要はありません。私はあなたの他の質問を思い出させます:http://stackoverflow.com/questions/508850/java-concurrency-cynicism-gone-too-far私は本当に並行コードが大好きなので、私はこれらのマルチスレッドの質問に取り組んでいるファンです、 すべてであります。 – jefflunt