2016-04-22 85 views
0

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

但是,当我尝试在Java中调用此代码时,JVM在到达main的结尾时仍然终止,而忽略正在运行的线程。一些研究表明,Java可能认为该线程是一个守护进程而不是“用户线程”。但是,如果是这种情况,那么我不能完全弄清楚如何说服Java它实际上是一个用户线程。

有没有人有这方面的线索?

回答

2

您需要致电AttachCurrentThread()本地线程,以确保Java知道它们,所以它会等待它们完成。

1

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

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

如果您的API想要继续执行一些超出调用进程的自然生命周期的任务,那么它可能应该创建一个子进程而不是一个线程。 (或者,如果API是特定于Java的,则可以假定使用JNI来请求Java代表其创建线程,或者使用Java注册线程。)

相关问题