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つの方法を学びました。