どのように優雅にスレッドを終了並行プログラミング(VII)

まず、いくつかの方法でスレッドを停止

  • 使用誘導灯 run()メソッドは、スレッドの中断を完了したときに、ある、通常、スレッドが終了します。
  • 使用割り込み()スレッド割り込み方法。
  • 使用停止()メソッドは、強制的にスレッドを終了、この方法で、使用することを推奨されていない放棄されています!

第二に、詳細な方法

スレッドを終了するためにフラグを使用します

/ **
 *設定されたフラグストップスレッド
 * / 
パブリック クラスMyThreadStop {

    // カウント
    プライベート 静的の int型の COUNT = 0 ;
     // 識別子の出口
    公共 静的 ブール出口= falseに


    / **
     *コアスレッド
     * / 
    パブリック 静的 ボイドメイン(最終文字列[]引数)がスローInterruptedExceptionあるが{
        スレッドt = 新しいスレッド(新しいTestThread());
        t.start();
    }

    / **
     *同期方法
     * / 
    パブリック 静的 同期 無効countNum(){
         のためにint型は、 I = 0; I; <100000 I ++ ){
             場合(= 500000、カウント> {)
                出口 = trueに ; // 変更フラグ、糸出口 
            } {
                カウント ++ ;
                System.out.println(カウント)。
            }
        }
    }

    / **
     *スレッドのエンティティ(Runnableを実装します)
     * / 
    静的 クラス TestThread 実装Runnableを{

        公共 無効RUN(){
             しばらく(出口!の){ // 識別子が停止に設定されていない場合は、パラメータ増分やってきた
                countNum()を。
            }
        }
    }
}

割り込みを使用し()メソッド割り込みスレッド

  • 割り込み()メソッドは、単にforループ文でbreak文のように、すぐにループを停止しません。
  • ()メソッドの呼び出し割り込みは、単に現在のスレッドマークで停止を行うことで、スレッドがすぐに終了しません。
  • ターゲットスレッドが通知の受信を処理する方法としては、それは、ターゲットスレッドの裁量に完全です。
/ **
 *割り込み()メソッドは、スレッドを停止します
 * / 
パブリック クラスMyThreadStop {

    // カウンタ
    プライベート 静的の int型の COUNT = 0 ;

    / **
     *コアスレッド
     * / 
    パブリック 静的 ボイドメイン(最終文字列[]引数)がスローInterruptedExceptionあるが{
        スレッドt = 新しいスレッド(新しいTestThread());
        t.start();
        // しばらくの間、睡眠、そして中断さ 
        t.sleep(200 );
        t.interrupt();
    }

    / **
     *同期方法
     * / 
    パブリック 静的 同期 ボイドcountNum(){
         ためINT iが= 0; I <500000; I ++ ){
            カウント ++ ;
            System.out.println(カウント)。
        }
    }

    / **
     *スレッドのエンティティ(Runnableを実装します)
     * / 
    静的の クラス TestThread 実装Runnableを{
         公共 のボイドの実行(){
            countNum();
        }
    }
}

  上記の例では、我々はメソッドがスレッドを停止、または終了まで継続し、直ちに中断するようには思えないことが判明し、これが原因割り込み()メソッドにあるだけで、ストップマークの現在のスレッドに再生されている、そしてスレッドがすぐに終了しません。ターゲットスレッドが通知の受信を処理する方法としては、それは、ターゲットスレッドの裁量に完全です。

  私たちは〜何を変換することができます

/ **
 *割り込み()メソッドは、スレッドを停止します
 * / 
パブリック クラスMyThreadStop {

    // カウンタ
    プライベート 静的の int型の COUNT = 0 ;

    / **
     *コアスレッド
     * / 
    パブリック 静的 ボイドメイン(最終文字列[]引数)がスローInterruptedExceptionあるが{
        スレッドt = 新しいスレッド(新しいTestThread());
        t.start();
        // しばらくの間、睡眠、そして中断さ 
        t.sleep(200 );
        t.interrupt();
    }


    / **
     *スレッドのエンティティ(Runnableを実装します)
     * / 
    静的 クラスは TestThread 実装したRunnable {
         公共 RUN(){
             のためにint型 I = 0; I <500000; I ++ ){
                 //は、決定通知割り込みスレッドかどうかを
                IF (にThread.currentThread()isInterruptedを()。){
                     / / 割り込みロジック・
                    ブレーク
                }
                カウント ++ ;
                System.out.println(カウント)。
            }
        }
    }
}

  中断裁判官に参加した後に、見つけることができ、スレッドの動作を停止

  PS:スレッドがスリープ()睡眠のときに割り込みが発生した場合、InterruptedExceptionある例外がスローされます。

  PS:のThread.sleep()メソッドによる中断に例外をスロー、ねじコードの後ろに割り込みフラグが続くクリアします

stop()メソッド

  それは放棄され、または単にそれを見てきたがstop()メソッドは、スレッドむしろ失礼なやり方を停止し、直接スレッドの作業を停止し、非常に危険な。

  なぜ停止を放棄:

  • ストップを呼び出し()メソッドがしますすぐに残りの作業のすべてで()メソッドを実行して停止する(表示する必要はありません。通常、この例外を捕捉し)キャッチまたはfinallyステートメントを含め、およびスロー異常のThreadDeathを、それはいくつかの原因になりますなどクローズファイル、データベース、など完成クリーンアップ作業の欠如、
  • ストップ()メソッドを呼び出しますすぐにすべてのロックが保持しているスレッドを解放し、データの不整合が発生し、データ同期の欠如につながります。

良いテキストをお勧めします:

おすすめ

転載: www.cnblogs.com/riches/p/12023692.html