interrupt()方法做了什么?如果下称处于挂起或者睡眠状态又会发生什么?使用interrupt()方法线程会立即停止吗?
让我们看一个代码如下:
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread t = new MyThread();
t.start();
Thread.sleep(1000);
t.interrupt(); // 中断t线程
t.join(); // 等待t线程结束
}
}
class My extends Thread {
public void run() {
Thread hello = new HelloThread();
hello.start(); // 启动hello线程
try {
hello.join(); // 等待hello线程结束
} catch (InterruptedException e) {
System.out.println("interrupted!");
}
hello.interrupt();
}
}
class Hello extends Thread {
public void run() {
int n = 0;
while (!isInterrupted()) {
n++;
System.out.println(n + " hello!");
}
}
}
第一个问题nterrupt()方法做了什么?
在Java中在正常运行中的线程。这个方法主要是发送一个终止信号。如果你想要让这个系统停止则需要你自己做一个方法处理,如my类在方法中启动了hello线程,当my线程使用nterrupt()方法时会使得while (!isInterrupted())不成立达到终止线程的目的。
在Java中,当一个线程被中断时,它会收到一个中断信号,但并不意味着它会立即停止执行。线程可以选择在收到中断信号后继续执行一段时间,或者响应中断并退出执行。在你提供的代码中,当MyThread被中断时,它会继续执行hello.interrupt(),这会中断HelloThread线程,即使这段代码不在finally块中。
如果下称处于挂起或者睡眠状态又会发生什么?
这种情况下当你使用完interrupt()方法会给个中断信号,当你对该线程使用join方法时他会发生报异常,让该线程真正的中断。
t.interrupt(); // 中断t线程
t.join(); // 等待t线程结束
使用interrupt()方法线程会立即停止吗?
在Java中,如果一个线程处于阻塞状态(如调用Thread.sleep()、Object.wait()或Thread.join()等方法),那么在接收到中断信号后,会抛出InterruptedException异常,从而打破阻塞状态,使线程有机会检查是否收到了中断信号,并执行适当的响应。在你的代码中,当HelloThread在睡眠时收到中断信号,它会抛出InterruptedException异常,并执行break退出循环,从而结束线程的执行。总的来说,线程被中断后并不会立即停止执行,而是有机会检查中断信号并执行适当的响应,具体的行为取决于线程的设计和实现。
我这个是看了廖雪峰老师的文章后的总结论述,如果想深入学习的同学可以去看原文