含む、本明細書で論じる様々な属性のメインスレッド:メインスレッド、スレッドの優先順位、デーモンスレッド、スレッドグループ、キャッチされない例外処理プロセッサ。
パブリック クラス優先{ @Test 公共 ボイドdefaultPriority(){ int型 mainThreadPriority = にThread.currentThread()getPriority()。 System.out.println( + mainThreadPriority "デフォルトの優先度は"); // 5 } @Test 公共 ボイドextendFather(){ スレッドmainThread = にThread.currentThread()。 mainThread.setPriority( 4 )。 INT mainThreadPriority = mainThread.getPriority()。 System.out.println( + mainThreadPriority "メインスレッドの優先順位がある"); // 4 スレッドT1 = 新しいスレッド(() - >のSystem.out.println(にThread.currentThread()のgetName())、 "T1"。); System.out.println( "T1のスレッドの優先順位は" + t1.getPriority()); // 4 } }
関連API:
無効 setPriorityを(int型の優先順位)を設定し、スレッドの優先順位 のint getPriority()は、スレッドの優先順位を取得します。
デーモンスレッド
ボイドは、setdaemon(ブールisDaemon)は、デーモン・スレッドまたはスレッドユーザスレッドとして提供されます。スレッドが開始される前に、このメソッドを呼び出す必要があります。 ブールこのスレッドがバックグラウンドスレッドであるかどうかを決定するisDaemon()
スレッドグループ
パブリック クラスThreadGroupDemo { 公共 静的 ボイドプリント(){ スレッドスレッド = にThread.currentThread()。 System.out.println(thread.getThreadGroup()のgetName() + " - " + thread.getName())。 } パブリック 静的 ボイドメイン(文字列[]引数){ スレッドグループ群 = 新しいスレッドグループ(「印刷グループ」)。 新しいスレッド(グループ、ThreadGroupDemo ::印刷、 "T1" ).start(); 新しいスレッド(グループ、ThreadGroupDemo ::印刷、 "T2" ).start(); group.list(); } }
キャッチされない例外ハンドラ
スレッドの実行が()異常が検出され投げることができない[インタフェースRunnable実行で定義されている()(その実行を書き換え、例外をスローしません)、例外をスローすることはできません、あなたはのtry-catchを使用して例外をキャッチすることができます] 。検出されない異常がのtry-catch処理を使用していない場合は、例外が発生したときしかし、死にスレッドの原因となります。(例えば、以下の例のように、コンソールは出力「Endind?」しません)
パブリック クラス UncaughtExceptionDemoを実装したRunnable { @Override 公共 のボイドの実行を(){ int型 I = 1/0 ; System.out.println( "Endind?" ); } パブリック 静的 ボイドメイン(文字列[]引数){ ExecutorServiceのサービス = Executors.newFixedThreadPool(1 )。 service.execute(新しいUncaughtExceptionDemo()); } } / *ログ: ... "プール-1-スレッド-1" java.lang.ArithmeticExceptionスレッドで例外:/ゼロで concurrency.attributes.UncaughtExceptionDemo.run(UncaughtExceptionDemo.java:10)で java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)で java.util.concurrent.ThreadPoolExecutor $ Worker.runで(ThreadPoolExecutor.java:624 ) java.lang.Thread.run(Thread.java:748)で * /
また、手動で実行時例外のメイン処理でのtry-catchを使用して、例外をスロー走行では、それが有効になりませんでした。(以下の例では、コンソールは出力しない「現在のスレッドは例外を発生します。」ん)
パブリック クラス UncaughtExceptionDemoを実装したRunnable { @Override 公共 のボイドの実行を(){ int型 I = 1/0 ; } パブリック 静的 ボイドメイン(文字列[]引数){ 試みる{ ExecutorServiceのサービス = Executors.newFixedThreadPool(1 )。 service.execute(新しいUncaughtExceptionDemo()); } キャッチ(のRuntimeException e)は{ のSystem.out.printlnは( "現在のスレッドは例外を発生します。" )。 } } } / * ... 例外スレッドで"プール-1-スレッド-1" java.lang.ArithmeticException:/ゼロによる concurrency.attributes.UncaughtExceptionDemo.run(UncaughtExceptionDemo.java:10)で java.util.concurrent.ThreadPoolExecutorで。 runWorker(ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)で java.lang.Thread.run(Thread.java:748)で * /
だから、どのようにそれを投げたスレッドの例外を処理する必要がありますか?スレッドが死ぬ前に例外が発生した後、実際には、例外がキャッチされない例外のためにプロセッサに渡されます。あなたは、スローのスレッドを処理するためのプロセッサを使用することができます。
インポートjava.util.concurrent.ExecutorService; インポートjava.util.concurrent.Executors; パブリック クラス ThreadExceptionResolve 実装Runnableを{ @Override 公共 ボイドRUN(){ int型 I = 1/0 ; (System.out.printlnは "?Endind" ); } 公共の 静的な 無効メイン(文字列[]引数){ // すべてのスレッドの2設定「例外ハンドラ」 Thread.setDefaultUncaughtExceptionHandler(新しい新しいMyUncaughtExceptionHandler()); // 3.実行のスレッドを作成し、そして = Executors.newFixedThreadPool-サービスExecutorServiceの(1。); service.execute(新しい新しいThreadExceptionResolve()); } } // 1ミート定義指定例外ハンドラスレッド"例外ハンドラ" // プロセッサは、一件の実施スレッドに属している必要があります。たuncaughtExceptionHandlerクラスインターフェース クラス MyUncaughtExceptionHandler 実装のThread.UncaughtExceptionHandler { @Override 公共 ボイドuncaughtException(スレッドT、のThrowable E){ するSystem.out.println( "acculation誤差である。" ); } } / * ... のあるエラーacculation 。 * /
二つの方法で取り付けられているプロセッサ:スレッド静的メソッドsetDefaultUncaughtExceptionHandler(たuncaughtExceptionHandler EHに)すべてのプロセッサスレッドのデフォルト設定を使用して、スレッドは実施例setUncaughtExceptionHandler(たuncaughtExceptionHandler EH)の方法で用いることができるが、スレッド・プロセッサをタッチするように設定されています。スレッドがプロセッサをインストールされていない場合、プロセッサは、見返りにこの時間ThreadGroupオブジェクトです。
// すべてのプロセッサスレッドのデフォルト設定の Thread.setDefaultUncaughtExceptionHandler(ハンドラ); // 指定されたスレッドのプロセッサが提供さ mainThread =スレッドにThread.currentThread()を、 mainThread.setUncaughtExceptionHandler(ハンドラ)。