【问题标题】:Detecting thread interruption with JNA native wait call (Windows)使用 JNA 本机等待调用检测线程中断 (Windows)
【发布时间】:2011-10-25 12:19:31
【问题描述】:

我正在尝试编写一些通过 JNA 执行等待的代码(例如,通过调用 Kernel32 函数 WaitForSingleObject),但如果调用 Thread.interrupt(),我也希望等待完成;我假设 Java 使用类似 Event 对象的东西来实现中断;有没有办法从 Java 获取事件以便在调用 WaitForMultipleObjects 时使用它?或者如果线程被中断,我还有其他方法可以安排我的等待完成吗?

【问题讨论】:

    标签: java windows multithreading jna


    【解决方案1】:

    Java 通过 NIO 支持它,但很少有人知道,有问题的类是抽象的,但这没问题:

    java.nio.channels.spi.AbstractInterruptibleChannel。它有 3 种有趣的方法:begin()end(),它们是最终的,加上你必须实现的方法:“protected abstract void implCloseChannel() throws IOException” 该方法将从调用interrupt()的线程中调用,所以要小心。

    使用很简单:在输入本机代码之前调用begin,返回时调用end()。处理 implCloseChannel 中的中断。

    编码愉快!

    【讨论】:

    • 谢谢。这比我做的方式好多了。
    【解决方案2】:

    今天早上我抽出一点时间做更多的研究,去挖掘 OpenJDK 源代码。事实证明,从原生实现开始是错误的;有一个纯 Java 机制可以做到这一点。

    sun.misc.SharedSecrets 类有一个静态方法 getJavaLangAccess(),它返回一个带有方法 blockedOn(Thread, sun.nio.ch.Interruptible) 的对象。这可用于安排 Thread.interrupt() 调用由我自己的对象之一提供的方法,此时我可以创建自己的中断事件对象,我可以使用该对象确保根据需要终止等待。

    这样做会引入对 sun 的 Java 类库实现的依赖,但可能不如挖掘 JVM 的本机状态以尝试提取它在内部使用的事件句柄。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-18
      • 2023-03-14
      • 2021-04-04
      • 2019-06-07
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多