【发布时间】:2014-05-17 09:58:33
【问题描述】:
一个线程打开一个资源,这是一个阻塞操作。如果成功,则需要线程再次关闭它,这又是阻塞的,但总是在有限的时间内成功。
可以使用一个标志(我们称之为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 ();
}
}
特别是,这是否确保线程在拥有资源时不会被中断?
据我所知,只有一个错误机会窗口,即在打开之后和设置标志之前。但是,这似乎不会导致资源泄漏,而是会意外忽略中断请求。有没有可能防止这种情况发生?
【问题讨论】:
-
实际上,关于我的最后一段,如果线程在睡眠开始时已经被中断,Thread.sleep() 是否会抛出 IE?那会改变一些事情。 javadoc 没有明确说明任何一种方式。
-
作为单独的问题添加:stackoverflow.com/questions/23710025
-
您是否尝试在中断后在睡眠期间中断?我想这种行为更容易测试,并有助于得到原始问题的答案。
-
现在就这样做:)
-
有趣的是,如果提前设置了中断单位,则尝试睡眠会引发。
标签: java multithreading interrupted-exception