我的代码中有一个异常中断,我试图理解原因。
发生的事情是我试图通过调用FilesUtils.filesMethod()在文件系统中的某个位置创建文件。
如果收到IOException,我将尝试睡眠100毫秒。 在睡眠期间,我需要检查是否被打扰(因为InterruptedException是睡眠的检查异常)。
如果是这样,我将打印“ Got interrupted”,并使当前线程的中断标志为true。
我在日志中打印出“中断”。
在我的代码中没有此线程的命令interrput()。
那会是什么?
这个senario是否有意义:
ilesUtils.filesMethod()的方法引发InterruptedIOException,因为该流在线程脚下关闭。同样,此InterruptedIOException将Interrupted标志设置为true。
我在catch(IOException e)中捕获了InterruptedIOException。
睡眠检查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();
}
}
答案 0 :(得分:1)
在不知道您的FilesUtils.filesMethod()
的实现细节的情况下,我们只能猜测这里发生了什么。
但是仅抛出InterruptedIOException
不会导致设置中断标志。
我猜测FilesUtils.filesMethod()
会在抛出InterruptedIOException
之前设置interrupt标志,然后sleep
方法会抛出InterruptedException
(因为设置了中断标志)。 / p>
您可以在调用sleep方法之前使用Thread.interrupted()清除中断标志(如果您希望在这种情况下可以进入睡眠状态)。因此sleep方法不会抛出InterruptedException
。(如果线程不再再次被中断)