开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情
前言
相信大家在日常开发的过程中,会经常调用 Thread 类或者 Thread 对象的interrupt、interrupted 、isInterrupted 这三个方法。然而,这三个方法经常容易混淆。今天,我就带大家来一起对它们进行区分。
三者区别
Java 中的线程控制机制是通过 interrupt 和 interrupted 两个方法来实现的。其中 interrupt 是线程的方法,用于向线程发送中断请求;而 interrupted 是线程的静态方法,用于判断线程是否被中断。
interrupt 方法
interrupt是线程的方法,通过该方法可以向线程发送中断请求,表示该线程的工作已经完成。该方法可以用来结束一个正在运行的线程。例如,下面的代码示例向线程发送中断请求:
public class InterruptLearnTest {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
System.out.println("do some ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
thread.interrupt();
}
}
运行结果:
通过运行结果,我们可以看到,线程在 sleep 的过程中被中断了。
interrupted 方法
interrupted 方法是线程的静态方法,用于判断线程是否被中断。例如,下面的代码示例判断线程是否被中断:
class InterruptedLearnTest {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
System.out.println("do some ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
System.out.println("线程启动了");
System.out.println(Thread.interrupted());
System.out.println(Thread.interrupted());
System.out.println("主线程结束了");
}
}
输出结果如下:
通过运行结果,我们可以看到,调用 Thread.interrupted() 方法的返回值一直都是 false,因为该方法是主线程进行调用的,而主线程一直在正常运行中,没有被中断过,所以 Thread.interrupted() 的返回值就一直是false。
此外,与 isInterrupted 方法不同的是,Thread.interrupted() 方法会清除线程的中断状态,也就是说调用完该方法的线程,会由中断状态转变为其他状态。
isInterrupted 方法
isInterrupted 方法是线程的实例方法,同样用于判断线程是否被中断。例如,下面的代码示例判断线程是否被中断:
class InterruptedLearnTest {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
System.out.println("do some ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
thread.interrupt();
System.out.println(thread.isInterrupted());
}
}
运行结果如下:
通过运行结果,我们可以看到,调用 thread.interrupt() 方法后,线程中断了,调用 thread.isInterrupted() 方法返回 true。但是,thread.isInterrupted() 不会清除线程的中断标志。