2016-04-22 24 views
0

私はJNIを使​​用してJavaでラップするC++でAPIを開発する初期段階にあります。ネイティブコードはWinAPIを使用してソケットリスナスレッドを作成します。このスレッドは無限に実行されるため、プログラムは無期限に開いています(テスト済みでうまく動作します)。JNI - ネイティブスレッドの実行が終了する前にJavaが終了する

しかし、Javaでこのコードを呼び出そうとすると、実行中のスレッドを無視して、JVMがメインの最後に到達するとJVMは終了します。少しの研究で、Javaはスレッドが「ユーザースレッド」ではなくデーモンだと考えるかもしれないと示唆しています。しかし、そうであれば、実際にJavaがユーザースレッドであることを納得させる方法を理解することはできません。

誰かがこれについて手掛かりを持っていますか?

答えて

2

AttachCurrentThread() Javaがそれらについて知っていることを保証するために、それらが終わるのを待つでしょう。

1

Windowsにはデーモンスレッドがありません。 ExitProcess()が呼び出されたとき、または最初のスレッドがアプリケーションのmain関数から戻るとき、プロセスは終了します。 (原則として、最後のスレッドが終了しても終了しますが、Windowsはスレッドがあなたのプロセスにスレッドを作成する可能性があるため、このスレッドを使用することはできません)

Javaランタイムは、プロセスを終了する前に、自身のスレッドを終了させる(デーモンスレッドとみなすスレッドを除く)。しかし、あなたのスレッドはWin32 APIを介して直接作成されていたので、Javaはそれらについて知らないのでそれらを待たないでしょう。

あなたのAPIが呼び出しプロセスの自然な寿命を超えていくつかのタスクを継続したい場合は、おそらくスレッドではなく子プロセスを作成する必要があります。 (または、APIがJava固有のものであれば、JNIを使​​用して、JavaがそのスレッドをJavaに代わって作成するか、Javaにスレッドを登録するかどうかを尋ねることができます)。

関連する問題