web-dev-qa-db-ja.com

JavaスレッドとOSスレッドを区別しますか?

実行中のJavaスレッドとネイティブスレッドを区別するにはどうすればよいですか?

Linuxでは、すべての子プロセスに親プロセスがあり、0がすべてのプロセスの親であると言います。フォークされたすべてのJavaスレッドの親スレッドがありますか?

どのJavaスレッドがOSスレッドに関連しているかを知るにはどうすればよいですか(Javaスレッドがネイティブプロセススレッドをフォークした場合))。

JavaスレッドおよびOSスレッドの命名規則はありますか?

実行中のJavaスレッドを他のJavaコードから中断または強制終了できますか?

46
karthi

Linuxでは、Javaスレッドはネイティブスレッドで実装されているため、スレッドを使用するJavaプログラムはスレッドを使用するネイティブプログラムと同じです。「Javaスレッド」 JVMプロセスに属する単なるスレッドです。

最近のLinuxシステム(NPTLを使用するもの)では、プロセスに属するすべてのスレッドは同じプロセスIDと親プロセスIDを持っていますが、スレッドIDは異なります。これらのIDは、_ps -eLf_を実行して確認できます。 PID列はプロセスID、PPID列は親プロセスID、LWP列はスレッド(LightWeightプロセス)IDです。 「メイン」スレッドには、プロセスIDと同じスレッドIDがあり、追加のスレッドには異なるスレッドID値があります。

古いLinuxシステムは、NPTLの代わりに、完全にPOSIXに準拠していない「linuxthreads」スレッド実装を使用する場合があります。 linuxthreadsシステムでは、スレッドのプロセスIDが異なります。

システムのCライブラリ(libc)をスタンドアロンプ​​ログラムとして実行し、その出力で「利用可能な拡張機能」を確認することで、システムがNPTLまたはlinuxthreadsを使用しているかどうかを確認できます。 「ネイティブPOSIXスレッドライブラリ」またはlinuxthreadsのいずれかに言及する必要があります。 Cライブラリへのパスはシステムによって異なります。_/lib/libc.so.6_、_/lib64/libc.so.6_(64ビットRedHatベースのシステムの場合)、または_/lib/x86_64-linux-gnu/libc.so.6_(最新のDebian-の場合) Ubuntuなどのベースのシステム)。

OSレベルでは、広告に名前はありません。それらはJVM内にのみ存在します。

pthread_kill() C関数を使用して、特定のスレッドにシグナルを送信できます。これを使用して、JVMの外部から特定のスレッドを強制終了することができますが、JVMがどのように応答するかわかりませんそれ。それはJVM全体を殺すだけかもしれません。

69
Wyzard

基準はありません。これは、使用しているJava=実装に完全に依存しています。また、「ネイティブスレッド」と「ネイティブプロセス」を混同しないでください。プロセスは、見えない独立したエンティティです。スレッドとは、ネイティブプロセスのアドレススペースで実行され、同じプロセスの他のスレッドのメモリを確認できるものです。

Linuxで表示されるものは別のものです。Linuxのバージョンによっては、親プロセスの各スレッドのプロセステーブルにエントリを作成します。これらの「プロセス」は、(分離の意味で)実際のプロセスではありません。これらは、psコマンドでリストできるスレッドです。親PID(PPID)を使用して、それらを作成したプロセスを見つけることができます。

8
Aaron Digulla

実行中のJavaスレッドを別のスレッドから中断または強制終了できますかJavaコード?

理論的にはそうです。実際には、Thread.kill()およびThread.suspend()メソッドは、非常に限られた状況を除いて安全でないため、推奨されません。基本的な問題は、Javaスレッドを強制終了または一時停止すると、それに依存する他のスレッドが混乱し、更新の途中であった可能性のある共有データ構造が混乱する可能性があります。

「別のJavaコード」が別のJVMを意味する場合、それが機能する可能性はさらに低くなります。関連するスレッド信号を送信する方法を理解しても、結果は完全に予測不可能です。私の賭けは、「ターゲット」JVMがクラッシュすることです。

5
Stephen C

Java=スレッドがOSスレッドにマップされる場合の一般的な解決策はありません。すべてのJVM実装が異なる方法でそれを行うことができます。

純粋なJavaスレッド実装、 グリーンスレッド と呼ばれる)もあります。これは、ネイティブスレッドがサポートされていない場合、またはシステムがマルチスレッドでない場合のフォールバックとして使用されますすべての緑のスレッドはOSに表示されません。

実行中のJavaスレッドを別のスレッドから中断または強制終了できますかJavaコード?

それらが同じJVMで実行されている場合は、はい、stop()を使用します。しかし、それは良い解決策ではなく、うまくいくかもしれません。 interrupt()は、スレッドを安全にシャットダウンします。

私が知っているJVMの外のスレッドを殺す方法はありません。 OSがスレッドの強制終了を実際にサポートしている場合、Javaアプリケーションが後で正しく実行されることは期待できません。

5
Hardcoded