使用JNA原生等待调用检测线程中断(Windows)

我试图写一些通过JNA执行等待的代码(例如通过调用Kernel32函数WaitForSingleObject),但是如果调用Thread.interrupt(),我还想等待完成。 我假设Java使用类似Event对象来实现中断; 有什么办法从Java获取事件,以便在调用WaitForMultipleObjects时使用它? 或者,如果线程中断,还有什么其他的方式可以安排我等待呢?

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

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

使用非常简单:调用在输入本地代码之前开始,在返回时结束()。 处理implCloseChannel中的中断。

快乐的编码!

找到了一些时间来做更多的研究,今天早上我去OpenJDK源代码挖掘远征。 事实证明,从本地实施开始是错误的; 有这样一个纯Java机制。

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

这样做会引入Sun对Java类库实现的依赖关系,但是可能不是通过挖掘JVM的本机状态来尝试提取内部使用的事件句柄。