1つ:なぜマルチスレッドの異常な捕獲について単独で話したいのですか?
まず例を見てください:
パブリッククラスのスレッドエクセプトは、runnable {@override public void run(){throw new runtimeexception();}:blic static void main(string [] args)を印刷しました。スレッド実行ステートメントは、トライキャッチブロックに配置されます。h(runtimeexception e){system.out.println( "例外が処理されました!");}}}ランタイムの異常は、メインのスレッドを手動で投げかけ、キャッチステートメントブロックで異常をキャプチャし、印刷しました。実行中の結果は、以下に示されています。
異常がコンソールに投げ込まれ、漁獲ブロックのステートメントが印刷されていないことがわかりました。
結論:異常を順番に実行するプロセスの異常を処理することはできません(スレッドの性質上、スレッドからの異常をキャプチャすることはできません。異常な脱出、タスクはタスクから外れています。この異常をキャプチャするために特別な形式を使用しない限り、コンソールに広がります。
それで、マルチスレッドの異常をキャプチャする方法について考えなければなりませんか?
2。マルチスレッドの異常をキャプチャします
以下の手順に従って、実験を完了しましょう。
1。例外プロセッサを定義します
次のように、スレッドのuncaultexceptionhandlerのcouptexceptionメソッドを実装する必要があります。
/ * * 1番目のステップ:スレッド異常なプロセッサ仕様に準拠する「異常なプロセッサ」を定義します * real.uncaughtexceptionhandler仕様 * / class myuncauptionhandlerはハンドラーを実装します{ / * * swreet.uncaughtexceptionhandler.uncaughtexception()それが死んでいるときに呼び出されます*/ @Override public void uncaugtexception(スレッドT、スロー可能e){System.out.println( "catch"+e);}}}}2。この異常なプロセッサを使用してスレッドファクトリーを定義します
/**ステップ2:スレッドファクトリ*スレッドファクトリを定義してタスクをスレッドに接続し、スレッドを異常なプロセッサにバインドします。 println(新しいスレッドの作成 "); = "+t.getuncaughtexcegeptler()); return t;}}
3。例外をスローさせるタスクを定義します
/ *ステップ3:system.out()。 ;新しいruntimeexception()
4。実験に電話してください
/**ステップ4:スレッドファクトリを使用してスレッドプールを作成し、その実行方法を呼び出します*/public class threadexceptionuncaughtexceptionhandler {public static void main(string [] args){executors副exec = executors.newcachedthreadpool(new hanldrtyreadfactory() )exec.execute(new ExceptionThread();}}実行中の結果は、以下に示されています。
3。結論
Javaのマルチスレッドスレッドによって生成される異常をキャプチャするには、異常なプロセッサをカスタマイズし、対応するスレッドファクトリー(つまり、最初のステップと2番目のステップ)に設定する必要があります。
第四、拡張
コードのどこでも同じ異常なプロセッサが使用されることがわかっている場合、より簡単な方法は、スレッドクラスに静的ドメインを設定し、このプロセッサをデフォルトの不十分なプロセッサに設定することです。
このプロセッサは、スレッドのない適切な不満足なプロセッサなしでのみ呼ばれます。
public static void main(String [] args){thread.setdefaultuncectexception(new myuncaugexceptionhandler())上記は、この記事で間違った場所がある場合は、マルチスレッドマルチスレッドマルチスレッドの異常なキャプチャのすべての内容です。