当前位置: 首页 > 面试题库 >

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

唐康安
2023-03-14
问题内容

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


问题答案:

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

java.nio.channels.spi.AbstractInterruptibleChannel。它具有3种感兴趣的方法:begin()end(),它们是最终的方法,另外还有一种您必须实现的方法:“受保护的抽象void
implCloseChannel()抛出IOException”。该方法将在调用interrupt()的线程中调用。

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

编码愉快!



 类似资料:
  • 我想用Java将一个文件放入Windows中的回收站。以便用户能够还原它。

  • 首先,我没有问与C#相同的问题-线程的替代品。睡眠?,或线程的替代品。睡在C#?。我不认为我使用它是错误的,需要一个真正的替代特定的情况。 在一次代码分析运行中,我看到了一个令人惊讶的违规行为: 线程的用法。睡眠()是设计缺陷的标志。 这一违规行为导致彼得·里奇(Peter Richie)撰写了一篇文章,阐述了为什么这构成了糟糕的设计。 我们都知道线程创建是昂贵的,线程阻塞意味着池中的争用。我们还

  • 问题内容: 与JNI相比,JNA似乎更易于调用本机代码。在什么情况下,您将在JNA上使用JNI? 问题答案: JNA不支持c 类的映射,因此,如果您使用的是c 库,则需要一个jni包装器 如果需要大量内存复制。例如,您调用一个返回大字节缓冲区的方法,对其中的内容进行更改,然后需要调用使用此字节缓冲区的另一种方法。这将需要您将该缓冲区从c复制到java,然后再将其从java复制回到c。在这种情况下,

  • 问题内容: 我正在为我的ubuntu服务器(针对我的多客户端匿名聊天程序)实现一种简单的线程池机制,并且需要使我的工作线程进入睡眠状态,直到需要执行一项工作(以函数指针和参数的形式) 。 我当前的系统即将关闭。我(工人线程正在)问经理是否有工作可用,以及是否有5毫秒没有睡眠。如果存在,请将作业添加到工作队列中并运行该函数。糟糕的循环浪费。 什么我 喜欢 做的是做一个简单的事件性的系统。我正在考虑有

  • 如果该线程在选择器中被阻塞,那么该线程的中断状态将被设置,并且它将立即从选择操作中返回,可能使用一个非零值,就像调用了选择器的wakeup方法一样。 如果前面的条件都不成立,那么该线程的中断状态将被设置。 中断不活动的线程不需要有任何影响。 我在Windows10 x64上用JDK10运行我的代码。

  • 我想并行化对不可重入的本机库(DLL)的调用。两个线程应该并行调用本机函数。我想使用JNA访问DLL。锁不是解决方案,因为这不是并行性。 我至今的想法是: > 线程池,其中线程将每个代理实例保存到加载了本机的DLL。loadLibrary() 线程池,每个线程将一个代理实例保存到具有不同名称的自己的物理DLL。每个都加载了N个ative.load库()。(它可能只有在相同的库接口,可以加载多个DL