5

ここで、スレッドを停止するか、 Java レイヤーで作成されたスレッドを強制終了します。このスレッドは JNI 関数を呼び出しています。アプリケーションの要件に応じて、状況によってはこのJNI 関数の実行を停止する必要があり、そうでない場合は停止する必要があります。

new Thread(new Runnable() {
    @Override
    public void run() {
         // My jni function call, It calls my JNI layer C function.
         }
   }

このスレッドの実行が開始され、JNI レベルで動作しているとき、私はそれについて心配していませんが、何らかの条件で他のクラスまたはメソッドからこの JNI の動作を停止したいので、どうすればこのスレッドを停止できますか。

注:ここでは、私のスレッドにも while ループがないため、グローバル フラグ変数でもチェックできません。

whileループなしでJNI関数を呼び出している間にスレッドを強制終了する方法について、誰もがアイデアを持っていますか。

4

3 に答える 3

12

スレッドがネイティブ コードを実行している場合、スレッドを安全に中断することはできません。スレッドにイベント ループがあったとしても、ネイティブ コールが終了するまで待機する必要があります。あなたのコードについて何も知らないので、長時間実行されているネイティブ呼び出しがあり、メインスレッドを詰まらせたくないので、その呼び出し用に別のスレッドを作成したと思います。単一のネイティブ コールを安全に中断する方法はありません。ここには特効薬はありません。いずれにしてもコードを変更する必要があります。私の提案は次のとおりです。

  • 単一の長いネイティブ呼び出しを一連の短い呼び出しに分解し、Java 側でイベント ループを実行します。
  • ネイティブ側でネイティブ呼び出しを内部的に分解し、ネイティブ側でイベント ループを実行します。ネイティブ インターフェイスには、中断フラグを設定するための別の方法が必要です。

Thread.interrupt()「ネイティブ関数の呼び出し」は、Javadoc で指定されている中断可能なアクションのいずれにも該当しないため、役に立ちません。Java スレッドは実行を続けますが、割り込みステータスのみが設定されます。

于 2013-02-11T14:44:48.370 に答える
2

スレッドを突然強制終了しないことが最善です。C 関数によって割り当てられたリソースは、解放されない場合があります。

C 関数が何かを待機している場合は、条件をトリガーして戻り、エラー コードを確認できます。

于 2013-02-07T10:29:53.393 に答える
-3

コードがネイティブの「JNI を介して呼び出される」または純粋な Java であることについて特別なことは何もありません。すべての IO コードは JNI コードを使用し、通常の Java スレッド メソッドを使用して停止できます。

使うだけThread.Stop() or Thread.Inturrupt()

于 2013-02-07T09:59:11.973 に答える