JNI - Java 在本机线程完成执行之前退出

JNI - Java exits before native threads finish executing

我正处于用 C++ 开发 API 的早期阶段,我正在使用 JNI 将其包装在 Java 中。本机代码使用 WinAPI 创建一个套接字侦听器线程,它应该 运行 无限期地保持程序无限期地打开(经过测试并且工作正常)。

然而,当我尝试在 Java 中调用此代码时,JVM 仍然在到达 main 的末尾时终止,忽略了 运行ning 线程。一些研究表明 Java 可能认为该线程是守护进程而不是 "user thread"。但如果是这样的话,那么我不太清楚如何说服 Java 它实际上是一个用户线程。

有人知道这件事吗?

Windows 没有守护线程。当调用 ExitProcess() 或应用程序主函数的初始线程 returns 时,进程退出。 (原则上,如果最后一个线程退出,它也会退出,但这不能作为依据,因为 Windows 可能会在您的进程中创建您不知道的线程。)

Java 运行时可能会在退出进程之前等待它自己的所有线程退出(除了那些它认为是守护线程的线程)。但是您的线程是直接通过 Win32 API 创建的,因此 Java 不知道它们,因此不会等待它们。

如果您的 API 想要在调用进程的自然生命周期之后继续执行某些任务,它可能应该创建一个子进程而不是线程。 (或者,如果 API 是 Java 特定的,它大概可以利用 JNI 请求 Java 代表它创建线程,或者用 [=16 注册线程=].)

您需要为所有本机线程调用 AttachCurrentThread(),以确保 Java 知道它们,因此它将等待它们完成。