java - 执行 native 代码的线程的正常关闭

标签 java multithreading native macos-carbon

在我的应用程序中,我有一个固定大小 1ExecutorService

现在线程调用一些 native 代码。在 native 方法内,它被阻塞并等待需要分派(dispatch)的操作系统事件。问题在于 ExecutorService 的正常关闭。

如果我中断线程,那么线程仍然不会出来(显然)。如果我将线程设置为守护进程。但它仍然不让 JVM 关闭。我唯一的工作代码是使用 System.exit ,出于明显的原因我不打算使用它。还有其他出路吗?

最佳答案

实际上,错误在于未返回的 native 代码。据我所知,通过更高级别的java来做到这一点的唯一方法是 stop()线程 - several reasons 已弃用该线程。

为此,您需要重新设计以使用老式的 Thread 而不是 ExecutorService。您也可以这样做,因为大小固定为 1,因此 ExecutorService 不会给您带来很多优势。据我从您的问题来看,如果您在 stop() 时没有在线程中保留任何锁,那么使用 stop() 似乎是一个可行的选择> 它。

编辑:

根据Apple's developer guide (第 47 页),您可以在调用 ReceiveNextEvent 时指定 EventTimeout:

ReceiveNextEvent runs the low-level event loop, placing events as they occur into the event queue. The function returns when an event you specified occurs, or when the specified timeout is exceeded.

OSStatus ReceiveNextEvent(
UInt32 inNumTypes,
const EventTypeSpec *inList,
EventTimeout inTimeout,
Boolean inPullEvent,
EventRef *outEvent);

所以,如果我理解正确地设置调用 native 代码时的超时将为您解决问题。

关于java - 执行 native 代码的线程的正常关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15567712/

相关文章:

java - 在 Eclipse 中自动打开完成窗口

java - Google App Engine 请求成本估算

compiler-construction - 使编译后的二进制文件以 native 速度完美运行,而无需从另一个系统上的源代码重新编译?

Windows关闭时的Java关闭 Hook 调用

android - 来自 native 的异常触发销毁事件

java - 收到错误 - 打开套接字时出错 : java.net.SocketException:我的应用程序中打开的文件太多

java - Tomcat Servlet 安全性

java - Java 编写互斥锁的最快方法?

c++ - 线程 : How to calculate precisely the execution time of an algorithm (duration of function) in C or C++?

java - 如果我们可以使用普通线程,为什么还要使用守护线程。守护线程可以做但普通线程不能做的事情是什么