javaでスレッドを終了する3つの方法

3299 ワード

javaにはスレッドを終了する3つの方法がある.それぞれ:
1.  終了フラグを使用して、スレッドを正常に終了させます.つまり、runメソッドが完了したら、スレッドは終了します.
     2.  stop方法を使用してスレッドを強制的に終了します.stopはsuspend、reumeと同じで、予期せぬ結果が発生する可能性があります.
       3.  interrupt法を使用してスレッドを中断します.
この3つの方法を詳しく紹介します.
1.終了フラグを使ってスレッドを終了する
ルン法が実行されると、スレッドは終了します.しかし、時にはrun方法は永遠に終わらないことがあります.サービス端末プログラムにおいて、スレッドを使用してクライアント要求を傍受する、または他のループ処理を必要とするタスク.この場合、一般的には、whileループのように、これらのタスクをサイクルに置く.サイクルをいつまでも続けたいなら、while(...)を使って処理してもいいです.しかし、whileを特定の条件でループバックさせるためには、最も直接的な方法として、bollanタイプのフラグを設定し、このフラグをtrueまたはfalseに設定することにより、whileサイクルの終了を制御することができます.以下に、終了フラグを用いてスレッドを終了する例を示した.
package chapter2;  
  
public class ThreadFlag extends Thread  
{  
    public volatile boolean exit = false;  
  
    public void run()  
    {  
        while (!exit);  
    }  
    public static void main(String[] args) throws Exception  
    {  
        ThreadFlag thread = new ThreadFlag();  
        thread.start();  
        sleep(5000); //      5   
        thread.exit = true;  //     thread  
        thread.join();  
        System.out.println("    !");  
    }  
}  
上のコードでは、終了フラグexitが定義されています.exitがtrueである場合、whileはループアウトし、exitのデフォルト値はfalseです.exitを定義する時、Javaキーワードvolatileを使用しています.このキーワードの目的は、exitを同期させることです.つまり、同じ時点で、一つのスレッドだけでexitの値を修正することができます.
2.stop方法でスレッドを終了する
stop方法を使用して、実行中またはスレッドを強制的に終了することができます.以下のコードを使ってスレッドを終了できます.
thread.stop();  
上のコードを使ってスレッドを終了することができますが、stop方法を使うと危険です.コンピュータの電源を突然オフにするように、正常なプログラムで電源をオフにするのではなく、予期せぬ結果が生じる可能性があります.したがって、stop方法を使ってスレッドを終了することは勧められません.
3.interrupt方法でスレッドを終了する
interrupt方法を使用して、端末スレッドは2つの状況に分けることができます.
    (1)スレッドは遮断状態にあり、例えばsleep法を使用している.
    (2)スレッドが中断されているかどうかはwhile(!isInterrupted(){...}を使って判定します.
    第一の場合にはinterrupt方法を使用して、sleep方法はInterruptedException例外をスローし、第二の場合にはスレッドは直接終了する.以下のコードは第一の場合にinterrupt法を用いることを実証した.
package chapter2;  
  
public class ThreadInterrupt extends Thread  
{  
    public void run()  
    {  
        try  
        {  
            sleep(50000);  //   50   
        }  
        catch (InterruptedException e)  
        {  
            System.out.println(e.getMessage());  
        }  
    }  
    public static void main(String[] args) throws Exception  
    {  
        Thread thread = new ThreadInterrupt();  
        thread.start();  
        System.out.println(" 50           !");  
        System.in.read();  
        thread.interrupt();  
        thread.join();  
        System.out.println("      !");  
    }  
}  
上のコードの運転結果は以下の通りです.
 50           !  
  
sleep interrupted  
      !   
  
interruptメソッドを呼び出した後、sleepメソッドは異常を投げ、エラー情報を出力します.
    注意:Threadクラスでは、スレッドがinterrupt方式で終了されたかどうかを判断する方法が二つあります.一つは静的な方法interrupted()であり、一つは非静的な方法isInterrupted()であり、この二つの方法の違いはinterruptedが現在の線が中断されているかどうかを判断するために用いられ、他のスレッドが中断されているかどうかを判断するためにISInterruptedが用いられてもよい.だから、while(!isInterrupted()もwhile(!Thread.interrupted()に変えられます.
 
文章の出所http://www.bitscn.com/pdb/java/200904/161228_3.html