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

时间:2019-02-14 11:37:58

标签: java multithreading interrupt interrupt-handling

我的代码中有一个异常中断,我试图理解原因。

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

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

如果是这样,我将打印“ Got interrupted”,并使当前线程的中断标志为true。

我在日志中打印出“中断”。

在我的代码中没有此线程的命令interrput()。

那会是什么?

这个senario是否有意义:

  1. ilesUtils.filesMethod()的方法引发InterruptedIOException,因为该流在线程脚下关闭。同样,此InterruptedIOException将Interrupted标志设置为true。

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

  3. 睡眠检查Interrupted标志是否为true。是(请参见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();
            }
        }

1 个答案:

答案 0 :(得分:1)

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

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

您可以在调用sleep方法之前使用Thread.interrupted()清除中断标志(如果您希望在这种情况下可以进入睡眠状态)。因此sleep方法不会抛出InterruptedException。(如果线程不再再次被中断)