gpt4 book ai didi

java - Thread.interrupt() 是邪恶的吗?

转载 作者:IT老高 更新时间:2023-10-28 21:05:06 24 4
gpt4 key购买 nike

一位队友提出以下声明:

"Thread.interrupt() is inherently broken, and should (almost) never be used".

我试图理解为什么会这样。

从不使用 Thread.interrupt() 是已知的最佳实践吗?您能否提供证据说明为什么它会损坏/有错误,并且不应该用于编写健壮的多线程代码?

注意 - 我对这个问题不感兴趣,如果它是来自设计防腐剂的“漂亮”。我的问题是 - 它有问题吗?

最佳答案

短版:

Is it a known best practice never to use Thread.interrupt()?

没有。

Can you provide evidence why it is broken / buggie, and should not be used for writing robust multithreaded code?

情况正好相反:它对多线程代码至关重要。

参见 Java Concurrency in Practice 中的 list 7.7举个例子。

加长版:

在这里,我们在一个特定的地方使用此方法:处理 InterruptedExceptions。这可能看起来有点奇怪,但这是代码中的样子:

try {
// Some code that might throw an InterruptedException.
// Using sleep as an example
Thread.sleep(10000);
} catch (InterruptedException ie) {
System.err.println("Interrupted in our long run. Stopping.");
Thread.currentThread().interrupt();
}

这为我们做了两件事:

  1. 它避免吃中断异常。 IDE 自动异常处理程序始终为您提供 ie.printStackTrace(); 之类的内容和轻松愉快的“TODO:这里需要一些有用的东西!”评论。
  2. 它恢复中断状态而不强制此方法检查异常。如果您正在实现的方法签名没有 throws InterruptedException 子句,这是您传播该中断状态的另一个选项。

一位评论者建议我应该使用未经检查的异常“强制线程终止”。这是假设我事先知道突然终止线程是正确的做法。我不。

在上面引用的列表之前的页面上引用 JCIP 的 Brian Goetz:

A task should not assume anything about the interruption policy of its executing thread unless it is explicitly designed to run within a service that has a specific interruption policy.

例如,假设我是这样做的:

} catch (InterruptedException ie) {
System.err.println("Interrupted in our long run. Stopping.");
// The following is very rude.
throw new RuntimeException("I think the thread should die immediately", ie);
}

我要声明的是,不管调用堆栈的其余部分和相关状态的其他义务如何,这个线程现在需要终止。我会试图偷偷溜过所有其他 catch block 和状态清理代码以直接导致线程死亡。更糟糕的是,我会消耗线程的中断状态。上游逻辑现在必须解构我的异常,以试图弄清楚是否存在程序逻辑错误,或者我是否试图将已检查的异常隐藏在一个模糊的包装器中。

例如,团队中的其他人必须立即执行以下操作:

try {
callBobsCode();
} catch (RuntimeException e) { // Because Bob is a jerk
if (e.getCause() instanceOf InterruptedException) {
// Man, what is that guy's problem?
interruptCleanlyAndPreserveState();
// Restoring the interrupt status
Thread.currentThread().interrupt();
}
}

中断状态比任何特定的InterruptException 都更重要。一个具体的例子为什么,参见 Thread.interrupt() 的 javadoc。 :

If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException.

如您所见,在处理中断请求时可以创建和处理多个 InterruptedException,但前提是保留该中断状态。

关于java - Thread.interrupt() 是邪恶的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com