InterruptedIOException 是否将线程的 Interrupted 标志设置为 true?

Does InterruptedIOException set the Interrupted flag of the thread to true?

我的代码中出现中断异常,我正在尝试了解原因。

我试图通过调用 FilesUtils.filesMethod() 在我的文件系统中的某个位置创建文件。

如果我收到 IOException,我会尝试休眠 100 毫秒。 在睡眠期间我需要检查我是否被打断了(因为InterruptedException是睡眠时的检查异常)。

如果是这样我打印"Got interrupted"并将当前线程的中断标志设置为真。

我正在 "Got interrupted" 打印到我的日志中。

在我的代码中没有任何地方有这个线程的命令 interrput()。

会是什么?

这个senario是否有意义:

  1. ilesUtils.filesMethod() 的方法抛出 InterruptedIOException,因为流已在线程脚下关闭。此外,此 InterruptedIOException 将 Interrupted 标志设置为 true。

  2. 我在 catch 中捕获了 InterruptedIOException (IOException e)。

  3. 睡眠检查中断标志是否为真。它是(见 1)所以它抛出 InterruptedException。

难道是这样吗?

        try {
            FilesUtils.filesMethod();
            break;
        } catch (IOException e) {
            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e1) {
                log.info("Got interrupted", e1);
                Thread.currentThread().interrupt();
            }
        }

在不知道您 FilesUtils.filesMethod() 的实现细节的情况下,我们只能猜测这里发生了什么。 但是只是抛出 InterruptedIOException 不会导致设置中断标志。

我猜 FilesUtils.filesMethod() 在抛出 InterruptedIOException 之前设置了 interrupt 标志,然后 sleep 方法抛出 InterruptedException (因为设置了中断标志) .

你可以在调用睡眠方法之前用Thread.interrupted()清除中断标志(如果你想在这种情况下能够睡眠)。所以睡眠方法不会抛出InterruptedException。(如果线程没有再次被中断)