2016-04-22 84 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註冊線程。)

相關問題