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



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

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

有人对此有线索吗?

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

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

Java 运行时大概会等待它自己的所有线程退出(它认为是守护程序线程的线程除外),然后再退出进程。 但是您的线程是直接通过 Win32 API 创建的,因此 Java 不知道它们,因此不会等待它们。

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

最新更新