Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么阻塞库方法通常通过调用static interrupted()而不是实例方法isInterrupted()来响应中断?_Java_Java.util.concurrent - Fatal编程技术网

Java 为什么阻塞库方法通常通过调用static interrupted()而不是实例方法isInterrupted()来响应中断?

Java 为什么阻塞库方法通常通过调用static interrupted()而不是实例方法isInterrupted()来响应中断?,java,java.util.concurrent,Java,Java.util.concurrent,将以下代码视为标题中提出的许多想法示例之一: 1258 public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout) throws Interrupted Exception { 1259 if (Thread.interrupted()) 1260 throw new InterruptedException(); 1261 return tryAcquire

将以下代码视为标题中提出的许多想法示例之一:

1258    public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout) throws Interrupted Exception {
1259        if (Thread.interrupted())
1260            throw new InterruptedException();
1261        return tryAcquireShared(arg) >= 0 ||
1262            doAcquireSharedNanos(arg, nanosTimeout);
1263    }

为什么大多数阻塞库方法通过调用静态方法
Thread.interrupted()
而不是实例方法
isInterrupted()
来响应中断。调用静态方法也会清除中断状态,因此,即使任务处理代码吞下中断异常,调用方也无法了解中断状态,除非

,如果捕获到一个
中断异常
,则中断标志已被清除。异常本身就是此时的信号机制。catcher需要重新启用标志或直接注意线程是否移动到结束位置。

基本上,您认为API/行为契约应该有所不同,并且您想知道为什么“他们”以这种方式设计它,而不是您喜欢的方式

我们不能回答这个问题。在讨论这些问题和作出决定时,这里没有人“在场”。如果你想要一个明确的答案,你需要找到最初的设计师并询问他们


不管怎么说,这个问题是没有意义的。。。除非您计划设计和实现自己的编程语言。

标题中问题的答案是“因为实现
Runnable
不会直接公开
isInterrupted()
”。显然,通过
Thread.currentThread().isInterrupted()
访问标志很简单,但这不是重点。关键是使用
Thread.interrupted()
更容易,因为这是您最应该做的

您对使用
线程的代码的投诉。中断了

如果你正在检查你的线程是否被中断,你应该在你的代码中的某个点上,你可以对它做些什么,否则这是什么意思?故意定义的机制阻止您悄悄退出循环。它特别鼓励您处理中断,有意地鼓励您通过抛出中断来处理中断

可疑的是调用
isInterrupted
的代码,而不是调用
interrupted
的代码。你应该<强>不/强>考虑安静地处理一个中断,你应该完全处理它或者根本不处理它。是
Thread.currentThread.isInterrupted()
调用方悄悄地吸收异常并因此导致问题,而不是
Thread.interrupted()
的调用方


请参见上的Heinz M.Kabutz博士,以获得更权威的讨论。

“如果您捕获到中断异常,中断标志通常已被清除。”这正是本例中库方法所喜欢的。但我的问题是,它们为什么要清除状态?它们可以通过调用isInterrupted()方法来轮询状态?但为什么?一旦该查询清除该标志,该方法就会抛出
InterruptedException
。为什么要做额外的步骤?您是否认为即使引发异常,标志仍应保持设置,从而对
InterruptedException
的约定提出异议?但这不是国旗的重点。是的,我不明白为什么国旗需要清除。如果任何任务的调用方接受了中断,会发生什么?现在有一种方法可以检查中断状态,除了调用
Thread.currentThread().interrupt()
的调用方之外。如果调用方意外地接受了InterruptedException,那么它很可能也无法调用
Thread.currentThread().interrupt()
。如果调用方接受了异常,他违反了中断机制的合同。在实践中发生这种情况的主要原因是
InterruptedException
是一个已检查的异常,迫使每个调用可中断操作的人都处理它,即使他还不知道它是什么。但很明显,这是机械装置设计者的想法。公平地说,这是一个非常脆弱的设计。与克隆类似。它患有“最薄弱环节”综合症。@MarkoTopolnik-公平地说,我还没有看到任何(可行的)设计做得更好。如果不抛弃Java的整个并发模型并重新开始,这个领域的一些基本问题是无法解决的。(而且所有其他基于线程的并发模型都有相同的基本问题。)没有银弹,但是取消选中
InterruptedException
,默认情况下不清除标志将使系统更容易处理错误。@MarkoTopolnik-这将问题从“不响应中断”改为“崩溃”;i、 用另一个(更糟的)问题替换一个问题。这里的根本问题是中断需要被中断线程的合作,这对于类似Java的线程模型来说是一个根本性的难题。在99%的实际情况下,异常不会崩溃,因为应用程序中存在异常障碍。处理代码将完成正确的中断语义所需的大部分工作——进行清理并中止当前任务。因为,如果它是真的,这是未经验证的,这就是作者编写它们的方式。问问作者。你问错地方了。不是建设性的。