javaでスレッドを終了する3つの方法
3299 ワード
javaにはスレッドを終了する3つの方法がある.それぞれ:
1. 終了フラグを使用して、スレッドを正常に終了させます.つまり、runメソッドが完了したら、スレッドは終了します.
2. stop方法を使用してスレッドを強制的に終了します.stopはsuspend、reumeと同じで、予期せぬ結果が発生する可能性があります.
3. interrupt法を使用してスレッドを中断します.
この3つの方法を詳しく紹介します.
1.終了フラグを使ってスレッドを終了する
ルン法が実行されると、スレッドは終了します.しかし、時にはrun方法は永遠に終わらないことがあります.サービス端末プログラムにおいて、スレッドを使用してクライアント要求を傍受する、または他のループ処理を必要とするタスク.この場合、一般的には、whileループのように、これらのタスクをサイクルに置く.サイクルをいつまでも続けたいなら、while(...)を使って処理してもいいです.しかし、whileを特定の条件でループバックさせるためには、最も直接的な方法として、bollanタイプのフラグを設定し、このフラグをtrueまたはfalseに設定することにより、whileサイクルの終了を制御することができます.以下に、終了フラグを用いてスレッドを終了する例を示した.
2.stop方法でスレッドを終了する
stop方法を使用して、実行中またはスレッドを強制的に終了することができます.以下のコードを使ってスレッドを終了できます.
3.interrupt方法でスレッドを終了する
interrupt方法を使用して、端末スレッドは2つの状況に分けることができます.
(1)スレッドは遮断状態にあり、例えばsleep法を使用している.
(2)スレッドが中断されているかどうかはwhile(!isInterrupted(){...}を使って判定します.
第一の場合にはinterrupt方法を使用して、sleep方法はInterruptedException例外をスローし、第二の場合にはスレッドは直接終了する.以下のコードは第一の場合にinterrupt法を用いることを実証した.
interruptメソッドを呼び出した後、sleepメソッドは異常を投げ、エラー情報を出力します.
注意:Threadクラスでは、スレッドがinterrupt方式で終了されたかどうかを判断する方法が二つあります.一つは静的な方法interrupted()であり、一つは非静的な方法isInterrupted()であり、この二つの方法の違いはinterruptedが現在の線が中断されているかどうかを判断するために用いられ、他のスレッドが中断されているかどうかを判断するためにISInterruptedが用いられてもよい.だから、while(!isInterrupted()もwhile(!Thread.interrupted()に変えられます.
文章の出所http://www.bitscn.com/pdb/java/200904/161228_3.html
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