随手录,后面慢慢集中整理,有点碎片化

终止线程的运行:多种办法。

  1. 通过可见的volite 变量 来 更改状态,根据变量的状态来根据逻辑从而退出线程

  2. 通过interrupt 来改变线程的中断状态,同理也可以去通过获取当前线程的中断状态,抛出异常或者正常退出

  3. 如果线程在sleep 或者 wait 状态,会被唤醒,抛出intellExcetion异常,同时会清理中断状态

当一个线程在执行 sleep()wait()join() 等可中断方法时,如果其他线程对它调用了 interrupt(),会发生以下事情:

  1. 该线程会立即从阻塞状态中被唤醒。

  2. JVM 会清除该线程的中断状态(即将中断标记设为 false)。

  3. 然后,该线程会抛出一个 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

关键结论与知识点

  1. 中断的本质是设置一个标志位thread.interrupt() 并不会立即终止线程,它只是给线程发了一个 “中断请求” 的信号,即将线程内部的一个布尔标志位设为 true

  2. 线程的响应是被动的:线程需要主动检查这个标志位(通过 isInterrupted()interrupted())来决定如何响应中断。

  3. 可中断方法的特殊处理:像 sleep()wait()join() 这些方法,在执行时会主动检查中断状态。如果发现状态为 true,它们会采取标准的响应流程:清除状态并抛出异常。这使得线程即使在阻塞等待时也能响应中断。

  4. InterruptedException 被捕获时,中断状态已被清除:这是一个非常重要的细节。当你在 catch 块中时,导致异常的那个中断状态已经被 JVM 自动清除了。如果需要,你可以在 catch 块中再次调用 Thread.currentThread().interrupt() 来恢复中断状态,以便上层调用者知晓。