スレッド属性の並行プログラミング

  含む、本明細書で論じる様々な属性のメインスレッド:メインスレッド、スレッドの優先順位、デーモンスレッド、スレッドグループ、キャッチされない例外処理プロセッサ。

 
メインスレッド
 
  任意のJavaプログラムが起動すると、少なくとも一つのスレッドがmainメソッドを実行し始めます、このスレッドは、メインスレッド(メインスレッド)と呼ばれています。それはつまり、スレッド他のスレッドを生成することである:すべての子孫はスレッド他のスレッドのメインスレッド。他のサブスレッドの作業を実行するために閉じているので、一般的に、メインスレッドは、最後端です。
 
スレッドの優先順位
 
  コンピュータは1つのCPUだけを持って、順番に各スレッドは、タスクを実行するためにCPUを使用する権利を取得しました。優先スレッド実行を決定するために、各スレッドは、優先順位を設定するために、優先度の高いスレッドの優先度が実行されます。デフォルトでは、各スレッドの優先順位は、その親スレッド(スレッドがスレッドを作成)優先順位を継承します。優先順位は、スレッドのデフォルトの優先度は5であり、通常の状況下では、1と10の間の整数です。(MAX_PRIORITY:MIN_PRIORITY、5:NORM_PRIORITY、10 1)3つの一般的な優先順位があります。
パブリック クラス優先{ 


    @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()は、スレッドの優先順位を取得します。

 

デーモンスレッド

    スレッドの保護者の唯一の役割は、そのようなので、上のファイル、データベース、などデーモンスレッドでの天然資源を、訪問決して、他のスレッドのためのサービスを提供することです。すべてのユーザー・スレッドが終了すると、デーモンスレッドが終了します。そしてときだけ、デーモンスレッド、仮想マシンが終了します。
 
     デフォルトでは、ユーザー・スレッドによって作成されたスレッドがユーザスレッド、デーモンスレッドまだデーモンスレッドによって作成されたスレッドです。
 
    ガベージコレクションスレッドのJava仮想マシンは、一般的なデーモンスレッドです。
 
    関連API:
ボイドは、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(ハンドラ)。

 

  

おすすめ

転載: www.cnblogs.com/BlueStarWei/p/11622421.html