Перейти к основному содержимому

Получить все запущенные потоки JVM

· 2 мин. чтения

1. Обзор

В этом коротком руководстве мы узнаем, как получить все запущенные потоки в текущей JVM , включая потоки, не запущенные нашим классом.

2. Используйте класс потока

Метод getAllStackTrace() класса Thread дает трассировку стека всех запущенных потоков. Он возвращает Map , чьи ключи являются объектами Thread , поэтому мы можем получить набор ключей и просто перебрать его элементы, чтобы получить информацию о потоках.

Давайте воспользуемся методом 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 , который запускает основную программу, у нас есть еще три потока. Этот результат может различаться в разных версиях Java.

Давайте узнаем немного больше об этих других потоках:

  • Диспетчер сигналов : этот поток обрабатывает сигналы, отправляемые операционной системой в JVM.
  • Finalizer : этот поток выполняет финализацию для объектов, которым больше не нужно освобождать системные ресурсы.
  • Обработчик ссылок : этот поток помещает объекты, которые больше не нужны, в очередь для обработки потоком Finalizer .

Все эти потоки будут завершены, если основная программа выйдет.

3. Используйте класс ThreadUtils из Apache Commons

Мы также можем использовать класс ThreadUtils из библиотеки Apache Commons Lang для достижения той же цели:

Давайте добавим зависимость в наш файл 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 .