java - 这是处理阻塞关闭的线程安全方法吗?

标签 java multithreading interrupted-exception

一个线程打开一个资源,这是一个阻塞操作。如果并且一旦成功,线程需要再次关闭它,这再次阻塞但总是在有限时间内成功。

可以使用无法以任何方式与其他线程同步的标志(我们称它为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/

相关文章:

java - NoClassDefFoundError 只有一些设备,只能来自 playstore?这甚至可能吗?

java - 使用 DateFormat 时,am/pm 字符串未本地化/翻译

c - 在 Linux 中 C 语言如何处理线程、管道和中断

multithreading - 我什么时候必须调用 XInitThreads?

java - 如何通过按钮监听器中断线程

java - Spring/Hibernate 应用程序中的角色/权限

java - Java集包含多个返回选项

java - 阻塞网络任务的问题

java - JVM catch InterruptedException 时是否需要退出