当被私有源代码重置时,是否有一种优雅的方式来保留中断状态?
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);
并在您自己的代码中处理异常。
我正在使用机器人 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);
并在您自己的代码中处理异常。