Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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 使用JNA本机等待调用检测线程中断(Windows)_Java_Windows_Multithreading_Jna - Fatal编程技术网

Java 使用JNA本机等待调用检测线程中断(Windows)

Java 使用JNA本机等待调用检测线程中断(Windows),java,windows,multithreading,jna,Java,Windows,Multithreading,Jna,我试图编写一些代码,通过JNA执行等待(例如,通过调用Kernel32函数WaitForSingleObject),但是如果调用了Thread.interrupt(),我也希望等待完成;我假设Java使用事件对象之类的东西来实现中断;有没有办法从Java获取事件,以便在调用WaitForMultipleObjects时使用它?或者,如果线程被中断,还有什么其他方法可以让我等待完成吗?今天早上,我花了一点时间做了更多的研究,开始了对OpenJDK源代码的深入研究。事实证明,从本机实现开始是错误的;

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

今天早上,我花了一点时间做了更多的研究,开始了对OpenJDK源代码的深入研究。事实证明,从本机实现开始是错误的;有一个纯Java机制可以实现这一点

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


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

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

java.nio.channels.spi.AbstractInterruptableChannel
。它有三种有趣的方法:
begin()
end()
,它们是final,另外还有一种必须实现的方法:“protected abstract void implCloseChannel()throws IOException” 该方法将从调用interrupt()的线程调用,因此要小心

用法非常简单:在输入本机代码之前调用begin,在返回时调用end()。处理通道中的中断


快乐编码

谢谢。这比我当时的做法好多了。