中断线程有三种方式,如下:
- 自定义中断标志位,
- 使用 interrup() 方法,(推荐)
- 使用 stop() 方法。
1. 自定义中断标志位
自定义中断标注位就是使用了一个标志位来控制线程的执行,当标志位位 true 的时候,线程继续执行,反之,线程退出循环或者执行完当前任务后停止。
public class MyThread extends Thread {
private volatile boolean flag = true;
// 中断线程的方法
public void stopThread() {
flag = false;
}
@Override
public void run() {
while(flag) {
// 业务代码
}
}
}
这种方式中断线程的优点就是代码比较直观,缺点就是中断不及时(当我想要立即中断线程的时候,做不到):当发送中断线程命令的时候,如果当前循环还没有执行完,那么需要等待本次循环执行完毕,下一次判断才会中断线程。
2. 使用 interrupt() 方法
class MyThread extends Thread {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// 业务代码
}
}
}
// 中断线程
myThread.interrupt();
第二种方法是官方推荐的写法,因为使用 interrupt 中断线程,他可以自行控制自己的行为:
- 它可以选择立即退出,
- 也可以选择稍后退出,
- 还可以不退出。
具体如何控制,看以下代码:
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while(!Thread.currentThread().isInterrupted()) {
// 业务代码
System.out.println("线程运行种...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
// 1.立即退出 -> break;
// 2.稍后退出 -> sleep();
// 3.不退出 -> 啥也不干
}
}
});
t.start();
Thread.sleep(1000);
System.out.println("控制新线程退出!");
t.interrupt();
}
3. 使用 stop() 方法
stop() 方法可以直接停止线程的运行,由于它太过粗暴了,所以这个方法已经被弃用了。因为如果立即中断线程的话,可以就会导致线程的资源还没有释放就被中断了,从而引发线程安全问题。
public class MyThread extends Thread{
@Override
public void run() {
while(true) {
// 业务代码
}
}
}
// 中断线程
myThread.stop();