在Java中终止一个线程的思路就是让线程中的run()方法尽快结束。
使用标志位
由于线程迟迟不结束大多是因为里面有循环语句,我们就可以使用一个成员变量来控制循环的结束。
不能使用局部变量定义在main方法内,因为虽然lambda表达式可以捕获上层变量,但是这个变量不可以进行修改。
public class Demo {
private static boolean isQuit = false;
public static void main(String[] args) {
Thread thread = new Thread(() ->{
while(isQuit) {
//具体操作
}
});
thread.start();
isQuit = true;
}
}
使用自带的标志位
方法 | 说明 |
---|---|
public void interrupt() | 中断对象关联的线程,如果线程正在阻塞,则以异常方式通知,否则设置标志位 |
public static boolean interrupted() | 判断当前线程的中断标志位是否设置,调用后清除标志位,不建议使用,静态方法为所有线程共用的 |
public boolean isInterrupted() | 判断对象关联的线程的标志位是否设置,调用后不清除标志位 |
Java中自带了标志位来标志是否结束循环。先使用Thread.currentThread()
获取到当前线程,在.isInterrupted()
获取标志位。然后再主进程中调用interrupte()
方法来将标志位值修改为true。
public class Demo {
public static void main(String[] args) {
Thread thread = new Thread(() ->{
while (!Thread.currentThread().isInterrupted()) {
//操作
}
});
thread.start();
thread.interrupt();
}
}
但是如果在线程中有捕获InterruptedException
异常的语句,那么会在调用interrupte()
同时捕获到该异常,并且消除标志位。
此时我们就可以在catch语句中自己选择是将线程结束还是进行其它操作。
public class Demo {
public static void main(String[] args) {
Thread thread = new Thread(() ->{
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//1.不操作继续执行线程
e.printStackTrace();
//2.结束线程
break;
//3.进行其它操作
}
}
});
thread.start();
thread.interrupt();
}
}