1.実行中の異常なスレッド入手
:4つのAPIのThreadクラスランタイムの異常処理
公共ボイドsetUncaughtExceptionHandler(たuncaughtExceptionHandler EH)を:たuncaughtExceptionHandlerスレッドで
のpublic static setDefaultUncaughtExceptionHandler(たuncaughtExceptionHandler EH):グローバルたuncaughtExceptionHandler設定します
(パブリックたuncaughtExceptionHandler getUncaughtExceptionHandlerを):特定を取得します。たuncaughtExceptionHandlerスレッド
のpublic staticたuncaughtExceptionHandler getDefaultUncaughtExceptionHandlerは():グローバルUncaughtExcepitonHandlerを取得します。
1.UncaughtExceptionHandlerはじめ
スレッドのJavaがたuncaughtExceptionHandlerインターフェースを提供し、スレッドの実行ユニットがチェック例外をスローすることはできません、スレッドは、独自のコンテキストで実行、そのスレッドが実行される異常に直接情報を取得することはできません導出し、例外がたuncaughtExceptionHandlerインタフェースを発生したときに動作中には、実行時になるようにスレッド・エラー、呼び出されると、エラーの種類。
Threadクラスは、内部インターフェイスたuncaughtExceptionHandlerインタフェースです。
@FunctionalInterface パブリック インターフェイスたuncaughtExceptionHandler { / ** *メソッド指定されたスレッドが起因して終了したときに呼び出さ *与えられたキャッチされない例外。 * <p>このメソッドが例外をスローした場合は無視されます * Java仮想マシン。 * @param スレッドt *の@paramのE例外 * / 無効uncaughtException(スレッドt、ThrowableのE)。 }
インタフェースは、関数インタフェースである、唯一の方法は、ThreadクラスのdispatchUncaughtException法と呼ばれます。
/ ** *ハンドラにキャッチされない例外を派遣。このメソッドはさ * JVMによってのみ呼び出されることを意図します。 * / プライベート ボイドdispatchUncaughtException(Throwableの電子){ getUncaughtExceptionHandler()uncaughtException(。この、E); }
例外は、スレッドを発生した場合、それはdispatchUncaughtExceptionメソッドコールバック・インターフェース・スレッド・インスタンスと異常情報を対応する送信される呼び出し
以下のサンプルコードを使用します:
パブリック クラスUncaughtExceptionHandlerTest { 公共 静的 ボイドメイン(文字列[]引数){ // 設定されたコールバックインターフェース Thread.setDefaultUncaughtExceptionHandler((T、E) - > { するSystem.out.println( "--->スレッド" + t.getName ()+ "次のように異常が発生し、異常情報がある:" ); e.printStackTrace(); }); 新しい新しいスレッド(() - > { 試み{ TimeUnit.SECONDS.sleep( 2 ); } キャッチ(InterruptedExceptionあるE1){ E1 .printStackTrace(); } //ここでチェックされない例外スロー のSystem.out.println(2/0 ;) })スタート();. } }
出力:
--->スレッドスレッド次のように0例外が発生し、例外情報は次のとおりです。 java.lang.ArithmeticException: / ZEROによって cp7.cp1.UncaughtExceptionHandlerTest.lambda $ AT 1(UncaughtExceptionHandlerTest.java:19 ) java.baseのAT /java.lang。 Thread.run(Thread.java:834)
2.Hookスレッド
2.1Hook糸導入は、
プログラムが終了は、フックスレッドがランタイムによってJVMプログラムをフックに複数のスレッドを注入することができ、実行を開始すると、プログラムにJVMをフックスレッドJVMを注入しました。
パブリック クラスHookTest { 公共 静的 ボイドメイン(文字列[]引数){ // 注入5个フック线程 ため(int型 i = 0; iが5 <; Iは++ ){ int型、X = I。 。Runtime.getRuntime()addShutdownHook(新しいスレッド(() - > { System.out.printlnは( "フック" + X + "実行" ); してみてください{ TimeUnit.SECONDS.sleep( 2 ); } キャッチ(InterruptedExceptionある電子) { e.printStackTrace(); } System.out.println( "フック" + X +は"上で" )。 }))。 } 試みる{ TimeUnit.SECONDS.sleep( 2 )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } のSystem.out.println(「主は終わりました」)。 } }
出力:
メインが終わった
HOOK2 RUN
hook1 RUN
hook0 RUN
hook4 RUN
hook3 RUNの
hook1が終わった
hook4は終わった
hook0の上にある
hook3の上にある
HOOK2上にある
2.2Hookスレッドや注意事項は、
スレッドが繰り返されるプロセスを開始、プログラムを起動するのを防ぐことができますフックあなたが見てファイルを作成することができます前に、リリースを決定するためのファイルを作成し、プログラムの終了時に、このファイルを削除フック糸の特性によって開始されたとみなされた場合、存在していたと。MySQLは、飼育係、カフカのソフトウェアは、ロックファイルの存在を確認することができますなどの
注意:
終了信号を受信したとき1)フックのスレッドがkill -9コマンドは、プロセスを終了する場合は、フックのスレッドが実行されない、のみ実行され、ファイルをロックしません。洗浄する
2)フックスレッドは、そのようなファイルハンドルを閉じて、作業を行うなどソケットのリンク、データベース接続を、いくつかのリソースを解放することができます
それ以外の場合は、プログラムを終了することができませんでした、3)フックのスレッドでいくつかの非常に長い時間のかかる操作を実行しないようにしよう