当被私有源代码重置时,是否有一种优雅的方式来保留中断状态?

Is there a graceful way to preserve interrupt status when it's reset by private source code?

我正在使用机器人 class 在我的程序中执行鼠标功能,但是我遇到了一个问题,它吞没了 InterruptedException 并打印了堆栈跟踪。这不好,因为我需要保留中断状态。

我发现问题特别出现在机器人 class 的 delay() 函数中,该函数在内部调用:

public synchronized void delay(int ms) {
    checkDelayArgument(ms);
    try {
        Thread.sleep(ms);
    } catch (InterruptedException ite) {
        ite.printStackTrace();
    }
}

函数是 public 所以我能够创建一个扩展 Robot 的自定义 class 并重写此方法以将 Thread.currentThread.interrupt(); 包含在 catch 块中,但我认为这是一个讨厌的黑客可能会产生影响。有没有更好的方法来处理这个问题?

看起来像这样 JDK bug report and note these dev mail comments here

如果您查看 JDK17 源代码,您会看到一个不同的实现,它不会丢失中断状态,尽管由于向后兼容性,原始 InterruptedException 丢失了:

public void delay(int ms) {
    checkDelayArgument(ms);
    Thread thread = Thread.currentThread();
    if (!thread.isInterrupted()) {
        try {
            Thread.sleep(ms);
        } catch (final InterruptedException ignored) {
            thread.interrupt(); // Preserve interrupt status
        }
    }
}

如果您无法更新到更高版本 JDK,您不妨调用 Thread.sleep(ms); 并在您自己的代码中处理异常。