一个线程打开一个资源,这是一个阻塞操作。如果并且一旦成功,线程需要再次关闭它,这再次阻塞但总是在有限时间内成功。
可以使用无法以任何方式与其他线程同步的标志(我们称它为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 ();
}
}
特别是,这是否确保线程在拥有资源时不会被中断?
据我所知,只有一个错误机会窗口,即在打开之后和设置标志之前。但是,这似乎不会导致资源泄漏,而是会意外忽略中断请求。有没有可能避免这种情况?
最佳答案
原始代码实际上是正确的。设置 bool 标志不是问题,即使问题错误地暗示它可能是问题。有两点需要考虑清楚:
首先,线路本身不会出错。如果打开成功,标志将被设置——总是。即使是 StackOverflow 或 OutOfMemory 也不会合理地发生在这里。
其次,如果 interrupt()
在没有执行可中断代码(例如 sleep )时被调用,则 interrupted
标志将被设置。下次任何可中断代码开始执行时,将检查此标志,并且将抛出中断异常而不是运行代码。
因此,原始代码确实按预期工作。
关于java - 这是处理阻塞关闭的线程安全方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23709949/