実行中のすべてのJVMスレッドを取得
1. 概要
この短いチュートリアルでは、クラスによって開始されていないスレッドを含め、現在のJVMで実行中のすべてのスレッドを取得する方法を学習します。
2. スレッドクラスを使用する
ThreadクラスのgetAllStackTrace()メソッドは、実行中のすべてのスレッドのスタックトレースを提供します。 キーがThreadオブジェクトであるMapを返すため、キーセットを取得し、その要素をループしてスレッドに関する情報を取得できます。
printf()メソッドを使用して、出力を読みやすくしましょう。
Set<Thread> threads = Thread.getAllStackTraces().keySet();
System.out.printf("%-15s \t %-15s \t %-15s \t %s\n", "Name", "State", "Priority", "isDaemon");
for (Thread t : threads) {
System.out.printf("%-15s \t %-15s \t %-15d \t %s\n", t.getName(), t.getState(), t.getPriority(), t.isDaemon());
}
出力は次のようになります。
Name State Priority isDaemon
main RUNNABLE 5 false
Signal Dispatcher RUNNABLE 9 true
Finalizer WAITING 8 true
Reference Handler WAITING 10 true
ご覧のとおり、メインプログラムを実行するスレッド main の他に、3つのスレッドがあります。 この結果は、Javaのバージョンによって異なる場合があります。
これらの他のスレッドについてもう少し学びましょう:
- Signal Dispatcher :このスレッドは、オペレーティングシステムからJVMに送信される信号を処理します。
- Finalizer :このスレッドは、システムリソースを解放する必要がなくなったオブジェクトのファイナライズを実行します。
- 参照ハンドラー:このスレッドは、不要になったオブジェクトをFinalizerスレッドで処理するためにキューに入れます。
メインプログラムが終了すると、これらのスレッドはすべて終了します。
3. ApacheCommonsのThreadUtilsクラスを使用します
Apache CommonsLangライブラリのThreadUtilsクラスを使用して、同じ目標を達成することもできます。
pom.xmlファイルに依存関係を追加しましょう。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
そして、 getAllThreads()メソッドを使用して、実行中のすべてのスレッドを取得します。
System.out.printf("%-15s \t %-15s \t %-15s \t %s\n", "Name", "State", "Priority", "isDaemon");
for (Thread t : ThreadUtils.getAllThreads()) {
System.out.printf("%-15s \t %-15s \t %-15d \t %s\n", t.getName(), t.getState(), t.getPriority(), t.isDaemon());
}
出力は上記と同じです。
4. 結論
要約すると、現在のJVMで実行中のすべてのスレッドを取得する2つの方法を学びました。