Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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 这是处理阻塞关闭的线程安全方法吗?_Java_Multithreading_Interrupted Exception - Fatal编程技术网

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中的大多数线程框架都使用线程中断来取消任务。它可能不受服务器程序员的欢迎,但当桌面/移动程序员忽视它时,我们最终会遇到一些奇迹,比如不间断的挂起下载或编译任务,这些任务数小时都无法停止。