1.スレッドを停止する方法
スレッドを停止する方法は3つあります。
1.終了フラグを使用して、スレッドを終了させます
2.メソッドが推奨されない場合は、stop()メソッドを使用してスレッドを強制的に終了します[期限切れのメソッド]
3.interrupt()メソッドを使用してスレッドを中断します
2.割り込み方式
割り込み方式を使用すると、スレッドをすぐに停止するのではなく、停止マークを付けることができます。
3.具体的にスレッドを停止するにはどうすればよいですか?
以下の方法は、「Javaマルチスレッドプログラミングコアテクノロジー」という本で説明されています。
1.異常な方法(推奨)
public class MyThread extends Thread {
@Override
public void run() {
try {
for (int i = 0; i < 500000; i++) {
if (MyThread.interrupted()){
System.out.println("已经是停止状态了,我要退出了!");
throw new InterruptedException();
}
System.out.println("i = " + (i+1));
}
System.out.println("如果我被输出了,则代表线程没有停止");
} catch (InterruptedException e) {
System.out.println("在MyThread类中的run方法中被捕获");
e.printStackTrace();
}
}
}
/**
* 根据中断状态退出for循环
*/
public class Main {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(100);
myThread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end!");
}
}
結果は次のとおりです。
2.スリープ状態でスレッドを停止します
睡眠の中断は2つの状況に分けられます:
- 最初にスレッドをスリープさせてから、割り込みを呼び出して割り込み状態をマークします。割り込みは、ブロックされたスレッドを中断します。スレッドを停止する効果を実現するために、割り込み例外がスローされます。
- スレッドは最初に割り込みを呼び出して割り込み状態をマークし、次にスレッドはスリープします。スレッドを停止する効果を実現するために、割り込み例外がスローされます。
1.最初に寝る
public class MyThread extends Thread {
@Override
public void run() {
try {
System.out.println("run-----------start");
Thread.sleep(5000);
System.out.println("run-----------end");
} catch (InterruptedException e) {
System.out.println("在沉睡中被停止!进入catch,线程的是否处于停止状态:" + this.isInterrupted());
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(2000);
System.out.println("状态:"+MyThread.interrupted());
myThread.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
結果は次のとおりです。
2.最初に割り込みをマークします
public class MyThread1 extends Thread {
@Override
public void run() {
try {
for (int i = 0; i < 100000; i++) {
System.out.println("i = " + (i+1));
}
System.out.println("run begin");
//interrupt是做一个中断标记,当时不会去中断正在运行的线程,当该线程处于阻塞状态时就会进行中断
//因此,先进行interrupt后,再遇到sleep阻塞时,才会进行中断
Thread.sleep(200000);
System.out.println("run end");
} catch (InterruptedException e) {
System.out.println("先停止,再遇到了sleep! 进入catch!");
e.printStackTrace();
}
}
}
public class Main1 {
public static void main(String[] args) {
MyThread1 myThread1 = new MyThread1();
myThread1.start();
myThread1.interrupt();
System.out.println("end!");
}
}
結果は次のとおりです。
3.暴力的な停止を停止する(非推奨)
4.returnステートメントはスレッドを停止します
- 割り込み状態としてマークされた割り込みを呼び出した後、runメソッドで現在のスレッド状態を判断し、割り込み状態の場合は戻ります。これにより、スレッドを停止する効果が得られます。
備考:スレッド停止のイベントを伝播できるように、例外をcatchブロックにスローすることもできるため、「例外のスロー」メソッドを使用してスレッドを停止することをお勧めします。