线程打开资源,这是一个阻塞操作。如果并且一旦成功,线程就需要再次关闭它,这又一次阻塞但总是在有限的时间内成功。
可以使用一个标志(让它调用它hasResource
),它不能以任何方式与其他线程同步,以指示该线程不希望被中断。根本不允许其他同步。
以下是处理此方案的安全方法吗?
@Override // we're subclassing Thread
public void run () {
try {
while (!interrupted ()) {
blockingOpen ();
// glitch possibility in this line
hasResource = true;
blockingClose ();
hasResource = false;
}
}
catch (final InterruptedException e) {
interrupt ();
}
}
特别是,这是否确保线程在拥有资源时不会被中断?
据我所知,只有一个错误机会窗口,就在Open之后和设置标志之前。但是,这似乎不会导致资源泄漏,而是意外忽略中断请求。是否有可能阻止这种情况?
答案 0 :(得分:1)
原始代码实际上是正确的。设置bool标志不是问题,即使问题错误地表明它可能是。有两点需要考虑清楚:
首先,线本身不会导致错误。如果Open成功,将设置标志 - 始终。这里甚至不能合理地发生StackOverflow或OutOfMemory。
其次,如果在没有执行可中断代码(例如睡眠)的情况下调用interrupt()
,则将设置interrupted
标志。下次任何可中断代码开始执行时,将检查此标志,而不是运行代码,将抛出中断异常。
因此,原始代码确实按预期工作。
答案 1 :(得分:0)
可以使用一个标志(让我们称之为hasResource),它不能以任何方式与其他线程同步,以指示该线程不希望被中断。根本不允许其他同步。
不,不是。
这是否确保线程在拥有资源时不会被中断?
没有。 如果<{em> hasResource
为volatile
且所有其他线程都知道hasResource
和观察它,那么你已经禁止自己调用Thread.interrupt()
,但你没有禁止 Java 这样做。
为什么你的应用程序线程会互相打断是另一个问题。从未在20年内使用过此功能。