位于Thread类中的interrupt()方法,它的作用就是中断线程。
一,停止正在运行的线程
public class MyThread implements Runnable {
@Override
public void run() {
while (true){
System.out.println("正在运行中");
}
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
// 为了使效果更明显,使当前线程休眠一秒
Thread.sleep(1000);
// 中断线程
thread.interrupt();
}
从运行结果可与看到,控制台一直在无限打印“正在运行中”,线程并没有停下来,似乎并没有达到我们的预期效果。
原因在于,interrupt()方法仅仅只是将线程标记为中断状态,并没有实际去停止这个线程,如果想要线程停下来,则需要手动判断线程是否被中断,然后在做出反应。
判断线程是否被中断有两个方法,分别是isInterrupted()和interrupted(),isInterrupted()是一个非静态方法,它的作用是判断线程是否被中断,interrupted()是一个静态方法,它可以直接被Thread调用,作用也是判断线程是否被中断,并且,它可以去清楚中断标记,这也是interrupted()方法和isInterrupted()方法的区别。
- isInterrupted()
isInterrupted()方法返回一个boolean类型,线程被中断返回true,否则false。
@Override
public void run() {
while (true){
// 获取当前执行的线程
Thread thread = Thread.currentThread();
// 判断线程是否被中断
if(thread.isInterrupted()){
break;
}
System.out.println("正在运行中");
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
// 为了使效果更明显,使当前线程休眠一秒
Thread.sleep(1000);
// 中断线程
thread.interrupt();
}
从运行结果中可以看到,当线程执行一秒后线程被中断了。
- interrupted()
interrupted()方法返回的也是一个boolean类型,线程被中断返回true,否则false。
@Override
public void run() {
while (true){
// 判断线程是否被中断
if(Thread.interrupted()){
break;
}
System.out.println("正在运行中");
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
// 为了使效果更明显,使当前线程休眠一秒
Thread.sleep(1000);
// 中断线程
thread.interrupt();
}
从运行结果可以看到,当线程执行一秒后线程被中断了。
查看线程中断的标记
- isInterrupted()
@Override
public void run() {
while (true) {
Thread thread = Thread.currentThread();
System.out.println(thread.isInterrupted());
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
// 为了使效果更明显,使当前线程休眠一秒
Thread.sleep(1000);
// 中断线程
thread.interrupt();
}
从运行结果可以看到,线程一开始并没有被中断,输出结果是false,一秒后,线程被中断,输出为true。
- interrupted()
@Override
public void run() {
while (true) {
System.out.println(Thread.interrupted());
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
// 为了使效果更明显,使当前线程休眠一秒
Thread.sleep(1000);
// 中断线程
thread.interrupt();
}
从运行结果来看,和之前的isInterrupted()方法有不同,线程一开始并没有被中断,输出的结果为false,一秒后线程被中断,结果变为了true,然后线程中断标记被清除,输出的结果又变回了false。