不会就选C. 2024-10-11 10:43 采纳率: 0%
浏览 11

JUC 两阶段终止设计模式 打断问题

我想问一下,在执行工作时被打断会不会抛异常进入catch块,请佬们详解一波

        Thread moniter = new Thread(() -> {
            System.out.println("开始监控");
            while (true) {
                Thread currentThread = Thread.currentThread();
                if (currentThread.isInterrupted()) {
                    System.out.println("被打断 料理后事");
                    break;
                }
                try {
                    Thread.sleep(1000); // 可能被打断
                    System.out.println("执行工作…………"); // 会不会进入catch块
                } catch (InterruptedException e) {
                    System.out.println("睡眠时被打断 重新设置打断标记为true");
                    currentThread.interrupt();
                }

            }
            System.out.println("监控结束");
        }, "moniter");


  • 写回答

1条回答 默认 最新

  • 香格里辣 2024-10-12 00:30
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    首先,让我们理解一下Java中的线程中断机制。当一个线程被中断时,它会接收到一个InterruptedException。这个异常通常会在阻塞调用(如Thread.sleep()Object.wait())中被抛出,表明该线程已经被中断。一旦线程抛出这个异常,你需要决定是否再次中断线程,这通常取决于你的业务需求。此外,当调用线程的isInterrupted()方法时,如果线程处于中断状态(即已经接收到中断请求),那么这个方法会返回true

    关于你的问题,让我们一步步分析你的代码:

    1. 当你的监控线程正在执行工作(即执行Thread.sleep(1000))时,如果其他线程调用了该线程的interrupt()方法,那么该线程会收到一个InterruptedException。此时,异常会被捕获并打印出"睡眠时被打断 重新设置打断标记为true"。由于你已经决定重新中断该线程,因此在catch块中又调用了currentThread.interrupt()
    2. 在接下来的循环中,当你检查isInterrupted()方法时,由于你刚刚重新设置打断标记为true,所以它会返回true。此时,会打印出"被打断 料理后事",并且跳出循环。这个过程并不会抛出任何异常,因为你在捕获了InterruptedException后已经处理了它。
    3. 关于你的问题,"执行工作…………"会不会进入catch块?答案是:不会。如果工作(也就是执行代码部分)运行得很好并未调用任何可能抛出中断异常的阻塞方法,那么就不会进入catch块。只有在执行诸如Thread.sleep()等可能抛出InterruptedException的阻塞方法时,才有可能进入catch块。

    总的来说,你的代码在处理线程中断时是正常的。如果在执行工作时被打断,它不会抛出异常进入catch块。只有在调用可能会抛出InterruptedException的阻塞方法时,才会抛出异常并处理它。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月11日