Java 这是处理阻塞关闭的线程安全方法吗?
线程打开一个资源,这是一个阻塞操作。如果成功,线程需要再次关闭它,这也是阻塞,但总是在有限的时间内成功 可以使用一个不能以任何方式与其他线程同步的标志(我们称之为Java 这是处理阻塞关闭的线程安全方法吗?,java,multithreading,interrupted-exception,Java,Multithreading,Interrupted Exception,线程打开一个资源,这是一个阻塞操作。如果成功,线程需要再次关闭它,这也是阻塞,但总是在有限的时间内成功 可以使用一个不能以任何方式与其他线程同步的标志(我们称之为hasResource)来指示线程不希望被中断。不允许任何其他同步 以下是处理这种情况的安全方法吗 @Override // we're subclassing Thread public void run () { try { while (!interrupted ()) { bloc
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()
,但未执行可中断代码(例如睡眠),则将设置interrupted
标志。下次任何可中断代码开始执行时,将检查此标志,并将抛出中断异常,而不是运行代码
因此,原始代码确实按照预期工作
可以使用一个不能以任何方式与其他线程同步的标志(我们称之为hasResource)来指示线程不希望被中断。不允许任何其他同步
不,不是
这是否确保线程在拥有资源时不会被中断
不可以。如果hasResource
是volatile
,并且您的所有其他线程都知道hasrource
并观察它,那么您已经禁止自己调用Thread.interrupt()
,但您没有禁止Java这样做
为什么应用程序线程会相互中断是另一个问题。20年来从未使用过此功能。实际上,关于我的最后一段,如果睡眠开始时线程已经中断,Thread.sleep()是否会抛出IE?这将改变一切。javadoc没有明确说明这两种方式。作为一个单独的问题添加:您是否尝试在中断之后的睡眠期间中断?我想,这种行为更容易测试,有助于回答最初的问题。现在就这样做:)有趣的是,如果中断的公寓设置得更早,尝试睡眠会引发问题。啊,现在我明白你当时的问题了。这仍然没有解决关闭资源的问题,但我认为,原始问题实际上并不需要它。实际上,在这种特定情况下,
Thread.interrupt()
可以被禁止-因为@mafu重写了线程,所以他也可以重写Thread.interrupt()
检查标志并在必要时忽略中断。顺便说一句,“20年来从未使用过此功能”-您是否从未使用过执行者或未来?Java中的大多数线程框架都使用线程中断来取消任务。它可能不受服务器程序员的欢迎,但当桌面/移动程序员忽视它时,我们最终会遇到一些奇迹,比如不间断的挂起下载或编译任务,这些任务数小时都无法停止。