juc 中断信号的部分理解
随手录,后面慢慢集中整理,有点碎片化
终止线程的运行:多种办法。
通过可见的volite 变量 来 更改状态,根据变量的状态来根据逻辑从而退出线程
通过interrupt 来改变线程的中断状态,同理也可以去通过获取当前线程的中断状态,抛出异常或者正常退出
如果线程在sleep 或者 wait 状态,会被唤醒,抛出intellExcetion异常,同时会清理中断状态
当一个线程在执行 sleep()、wait() 或 join() 等可中断方法时,如果其他线程对它调用了 interrupt(),会发生以下事情:
该线程会立即从阻塞状态中被唤醒。
JVM 会清除该线程的中断状态(即将中断标记设为
false)。然后,该线程会抛出一个
InterruptedException异常。
Thread 中 几个 静态方法:
sleep() 让当前线程休眠
Thread.currentThread().isInterrupted()
返回当前线程的中断状态(true 表示已中断,false 表示未中断)。 调用这个方法不会改变线程的中断状态。也就是说,连续调用两次,如果中间没有其他操作,会返回相同的结果。这使得它非常适合用于轮询检查。
Thread.interrupted()
它也会返回当前线程的中断状态。 调用这个方法会清除线程的中断状态。如果线程当前是中断状态(
true),调用后它会返回true,然后将状态重置为false。如果是false,调用后依然是false。
package syncenrot;
public class Show {
public static void main(String[] args) throws InterruptedException {
System.out.println("开始 模拟了");
Thread thread = new Thread(() -> {
for(int i = 0; i < 5; i++) {
System.out.println("线程正在运行");
System.out.println(Thread.currentThread().isInterrupted() + "当前 的线程 状态") ;
}
//Thread.interrupted();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().isInterrupted() + "当前 中断 的线程 状态") ;
System.out.println("线程被中断");
}
});
Thread.sleep(1000);
thread.start();
thread.interrupt();
thread.join();
System.out.println("结束 模拟了");
}
}
这里测试 Thread.currentThread().isInterrupted() 来获取当前的中断状态, 提前调用thread.interrupt(); 改变中断状态为true,for 中根据情况后面几个会输出当前状态为 true 了,然后 当 遇到 sleep 的时候, 会一直监测到当前状态,,因为当前中断状态true, 就抛出异常,同时jvm 会清理当前中断状态, 此时在打印就是false 了,当然 也可以有时候 要 多次执行,可以调用Thread.currentThread().interrupt();
会返回当前的中断状态,同时 清理 改成false
关键结论与知识点
中断的本质是设置一个标志位:
thread.interrupt()并不会立即终止线程,它只是给线程发了一个 “中断请求” 的信号,即将线程内部的一个布尔标志位设为true。线程的响应是被动的:线程需要主动检查这个标志位(通过
isInterrupted()或interrupted())来决定如何响应中断。可中断方法的特殊处理:像
sleep()、wait()、join()这些方法,在执行时会主动检查中断状态。如果发现状态为true,它们会采取标准的响应流程:清除状态并抛出异常。这使得线程即使在阻塞等待时也能响应中断。InterruptedException被捕获时,中断状态已被清除:这是一个非常重要的细节。当你在catch块中时,导致异常的那个中断状态已经被 JVM 自动清除了。如果需要,你可以在catch块中再次调用Thread.currentThread().interrupt()来恢复中断状态,以便上层调用者知晓。