在运行的多线程中怎么正确的中断该线程呢?今天废话不多说直面主题,中断执行的线程。
- 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使用,否则没有。