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 .