在運行的多線程中怎麼正確的中斷該線程呢?今天廢話不多說直面主題,中斷執行的線程。
- interrupt() 配合阻塞中斷線程
- 異常中斷法
大家可能有聽說過 interrupt 是用於中斷線程,但是它真的就可以中斷線程嗎?
public class MyInterrupt implements Runnable {
public static void main(String[] args) {
new Thread(new MyInterrupt()).start();
}
@Override
public void run() {
System.out.println("子線程開始執行");
Thread.currentThread().interrupt();
System.out.println("子線程沒有停止");
}
//運行結果
//子線程開始執行
//子線程沒有停止
}
我們可以看到,我們使用interrupt並不能直接使線程中斷。在執行了中斷線程之後,線程還是繼續在執行。怎麼結局呢?
interrupt() 配合阻塞中斷線程
public class MyInterrupt implements Runnable {
public static void main(String[] args) {
new Thread(new MyInterrupt()).start();
}
@Override
public void run() {
System.out.println("子線程開始執行");
try {
//阻塞線程
this.wait();
Thread.currentThread().interrupt();
System.out.println("子線程沒有停止");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我還在執行");
}
}
執行結果:
從這裏我們就可以看到,這個時候並沒有看到打印後面的語句,那就證明了我們的子線程以及停止了。
異常中斷法
public class MyInterrupt implements Runnable {
public static void main(String[] args) {
new Thread(new MyInterrupt()).start();
}
@Override
public void run() {
System.out.println("子線程開始執行");
int i = 1 / 0;
System.out.println("子線程沒有停止");
System.out.println("我還在執行");
}
}
運行結果:
從上圖我們也可以清晰的看到,並沒有在控制檯大廳語句,從而證明了我們成功的中斷線程。
總結:interrupt()方法需要搭配一個阻塞進行使用,拋出異常也可以成功的中斷線程,但是拋出異常不要配合Try和Catch使用,否則沒有。