JNI-Java在本机线程完成执行之前退出 我在开发C++中的API的早期阶段,我用JNI用java包装。本机代码使用WinAPI创建一个套接字侦听器线程,该线程应无限期运行,从而使程序无限期地打开(经过测试,工作正常)

JNI-Java在本机线程完成执行之前退出 我在开发C++中的API的早期阶段,我用JNI用java包装。本机代码使用WinAPI创建一个套接字侦听器线程,该线程应无限期运行,从而使程序无限期地打开(经过测试,工作正常),java,c++,multithreading,winapi,java-native-interface,Java,C++,Multithreading,Winapi,Java Native Interface,但是,当我尝试在Java中调用此代码时,JVM在到达main末尾时仍然会终止,忽略正在运行的线程。一些研究暗示Java可能认为线程是守护进程而不是“用户线程”。但如果是这样的话,那么我就不太明白如何让Java相信它实际上是一个用户线程 有人对此有线索吗?Windows没有守护进程线程。当调用ExitProcess()或当初始线程从应用程序的主函数返回时,进程将退出。(原则上,如果最后一个线程退出,它也会退出,但这是不可靠的,因为Windows可能会在您的进程中创建您不知道的线程。) Java运行

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


有人对此有线索吗?

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

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


如果您的API希望在调用进程的自然生命周期之外继续执行某些任务,那么它可能应该创建一个子进程而不是线程。(或者,如果API是特定于Java的,它可能会利用JNI请求Java代表它创建线程,或者用Java注册线程。)

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

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


如果您的API希望在调用进程的自然生命周期之外继续执行某些任务,那么它可能应该创建一个子进程而不是线程。(或者,如果API是特定于Java的,它可能会利用JNI请求Java代表它创建线程,或者用Java注册线程。)

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

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