我正处于用C ++开发API的早期阶段,我使用JNI将其包装在Java中。本机代码使用WinAPI创建一个套接字侦听器线程,该线程应无限期运行,从而使程序无限期地打开(测试并正常工作)。
但是,当我尝试在Java中调用此代码时,JVM在到达main的末尾时仍会终止,忽略正在运行的线程。一项小小的研究暗示Java可能认为该线程是守护进程而不是“用户线程”。但如果是这种情况,那么我就无法弄清楚如何说服Java它实际上是一个用户线程。
有没有人对此有所了解?
答案 0 :(得分:2)
您需要为所有本机线程调用AttachCurrentThread()
,以确保Java了解它们,因此它将等待它们完成。
答案 1 :(得分:1)
Windows没有守护程序线程。当调用ExitProcess()或初始线程从应用程序的主函数返回时,进程退出。 (原则上,如果最后一个线程退出,它也将退出,但是不能依赖它,因为Windows可能会在您的过程中创建您不知道的线程。)
Java运行时可能会在退出进程之前等待所有自己的线程退出(除了那些它认为是守护程序线程的线程)。但是您的线程是通过Win32 API直接创建的,因此Java不了解它们,因此不会等待它们。
如果您的API希望在调用进程的自然生命周期之外继续执行某些任务,则应该创建子进程而不是线程。 (或者,如果API是特定于Java的,它可能会使用JNI来请求Java代表它创建线程,或者使用Java注册线程。)