2012-03-09 11 views
2

これは私の状況です:Java:JNI関数を使用して連続するC++関数を呼び出すスレッドを停止するにはどうすればよいですか?

"JavaToCpp"クラスのJNIメソッドを使用してC++ DLLにデータの配列を送信するJavaアプリケーションがあります。

C++ DLLがすべてのデータを受信すると、C++ DLLはいくつかの処理を開始します。

(長い)(C++)プロシージャ/サブルーチン中にJavaインターフェイスがフリーズしないように、新しいスレッドを使用して「JavaToCpp」クラスを実行しています。

Iは、作業(C++)手順/サブルーチンを停止するために2つのメソッドを実装し:

  • 最初の「STOP」を:それはきれいにできるように、C++ DLLによって読み取られようとしているファイルを作成しています実行中のプロシージャ/サブルーチンを停止します。
  • もう一つは「KILL」:シャットダウンになっている/直接

実行されているC++手続き/サブルーチンを殺すの問題はしばらく探した後、私はそれをperfomする何か良いトリックを見つけられませんでした、ということです。

だから、手続き/サブルーチンが実行されているされている間、誰のは、スレッドを殺す方法についてのアイデアを得た場合...

答えて

2

Javaでスレッドを「強制終了」する唯一の方法は、です。stop()メソッドです。

ご使用になる前に、why it's deprecatedをよく読んで理解してください。あなたがそれを理解すれば、あなたはそれを使用しません。

だから、いいえ、スレッドを殺す良い方法はありません。しかし、なぜあなたはC++について話しているのですかのプロセス(つまり、プロシージャ、つまりサブルーチンを意味しましたか?)ネイティブ部分を処理するために別のプロセス(スレッドではない)を使用すると、簡単に停止することができます:ProcessBuilderProcess.destroy()を使用してください。ネイティブなものを呼び出すためにスレッドの代わりにプロセスを使用することには他にも利点があります。 1つの利点は、不安定なネイティブプロセスがJavaプロセスを停止しないことです。

+0

はい、申し訳ありませんが、私は "プロシージャ/サブルーチン"を意味しました。 「プロセス」を使用してC++ DLLを呼び出すと、同じ方法で動作しますか? (私はそれがより多くのメモリを使用すると仮定し、私のressourcesはDllと共有されませんでした(例では、私のC++ DLLから結果をJava GUIに追加するJavaメソッドを呼び出さなければなりません) – Jsncrdnl

+0

@ Kuroicloud666:同じプロセス内で呼び出します。別のプロセスを使用する場合は、TCP/IPソケット(おそらくより簡単)やパイプ(おそらく高速)、一時ファイル(いくつかのケースでは大丈夫かもしれません)などのプロセス間通信メカニズムを使用する必要があります。したがって、これらを切り替えるのは簡単ではありません。基本的な設計上の決定です。 –

+0

オコケ、答えてくれてありがとう。 – Jsncrdnl

2

ベストプラクティスの方法は、決定するために、実行時間の長いタスクによってチェックされる揮発性の変数を持つことですいつ止めるか。 Thread.currentThread().isInterrupted()フラグを使用できます。

問題は、よく振る舞わないために、ほとんどのスレッドを殺したいということです。この状況では、唯一の選択肢はプロセスを終了させることです。これは通常、別のプロセスでプロセスを開始することを意味します。

+0

私のJavaアプリケーションから新しい価値を得るために私のC++ライブラリには数えられません。この場合、あなたは私に話している、私はすでに解決策があります。私が知る必要があるのは、スレッドを落とす/殺す/停止する方法(そして実行中のC++プロセス)がある場合です。 – Jsncrdnl

+0

スレッドを殺すプロセスを通知する必要があります。スレッド、メモリ、ロック、ファイルなどのリソースを共有するように個々のスレッドを殺すことは安全ではない –

関連する問題