在 Java 中,中断是通过线程的 interrupt 方法来实现的。这个方法会通知目标线程被中断,并修改线程的中断状态(即打上中断标记),但并不会强制线程停止。
在一个线程内部,可以通过调用 Thread 类提供的 interrupted 和 isInterrupted 方法来了解线程是否被中断,并进行相应处理。这两个方法之间有一定的区别,下面我们详细解释。
1、interrupted()方法
interrupted 是一个 Thread 静态方法,用于了解当前线程是否被中断。它具体执行的操作如下:
- 返回 true 表示当前线程已经被中断,并清空线程的中断状态。
- 返回 false 表示当前线程未被中断。
重要提示:如果 Thread.interrupted() 方法返回 true,那么该方法会自动将该线程的中断标志设置为 false。因此,如果在一个线程的run方法中多次调用 interrupted 方法的话,第一次调用返回true,后续调用都会返回false。
2、isInterrupted()方法
isInterrupted 是一个实例方法,用于查询当前线程是否被中断。具体执行的操作如下:
- 如果线程已被中断,则返回 true。
- 否则,返回 false。
需要注意的是,与 interrupted 方法不同,isInterrupted 不会改变线程的中断状态。
实际使用时,可以根据您的需求选择这两种方法之一。例如,在编写一个多线程程序的开发中,可以通过调用 interrupted 方法使用线程自己检查是否被中断,并根据结果采取相应措施。同时,由于 isInterrupted 不清空线程的中断状态,因此该方法更适合在某个线程中运行检查当前线程是否被中断的代码。
下面我们来展示一些使用这两种方法的实例:
代码语言:javascript复制class MyThread extends Thread {
public void run() {
while (!interrupted()) {
// do something here
}
System.out.println("My thread has been stopped");
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt(); // 中断线程
}
}
在上面的例子中,我们通过使用 interrupt 方法在主线程内部中断了启动后的 MyThread。MyThread 在执行期间会不停地检查自己的中断标志,如果没有被设置,就继续执行;如果被设置了,就退出循环并输出 log 信息。
总之,在编写多线程程序时,正确地使用 interrupted 和 isInterrupted 方法是非常重要的。深入了解这些方法的区别和功能可帮助您避免一些 Java 多线程程序中常见而又棘手的问题。