Установка и получение имени потока в Java

В этой статье мы научимся устанавливать и получать имена потоков в Java на простых примерах, используя встроенные методы setName() и getName() в классе Thread.

1. Получение имени потока

По умолчанию компилятор Java устанавливает имя по умолчанию для каждого потока при создании, и мы можем получить имя потока с помощью метода Thread.currentThread().getName().

В следующем примере мы создали поток, реализовав интерфейс Runnable и его метод run(). Этот код выведет на консоль имя потока по умолчанию.

Thread thread = new Thread(() -> {System.out.println(Thread.currentThread().getName());});thread.start(); //Prints Thread-0

Если мы создадим больше потоков, то числовая часть в имени по умолчанию будет увеличиваться с количеством потоков, т. е. Thread-1, Thread-2, Thread-3… и т. д.

Аналогично генерируются имена по умолчанию для потоков, работающих в ExecutorService, по шаблону pool-1-thread-1.

ExecutorService executorService = Executors.newFixedThreadPool(3);executorService.submit(() -> {System.out.println(Thread.currentThread().getName()); //Prints pool-1-thread-1});

Если мы запустим 3 задачи в этом исполнителе, то имена потоков будут pool-1-thread-1, pool-1-thread-2, pool-1-thread-3. Ознакомьтесь со следующим примером, чтобы лучше понять шаблон именования.

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executorService = null;try {executorService = Executors.newFixedThreadPool(3); //pool-1executorService.submit(() -> {System.out.println(Thread.currentThread().getName()); //thread-1});executorService.submit(() -> {System.out.println(Thread.currentThread().getName()); //thread-2});executorService = Executors.newFixedThreadPool(3); //pool-2executorService.submit(() -> {System.out.println(Thread.currentThread().getName()); //thread-1});} finally {executorService.shutdown();}}}

Вывод программы:

pool-1-thread-1pool-1-thread-2pool-2-thread-1

2. Установка имени для потока

Мы можем задать пользовательское имя потока двумя способами:

  • Конструктор класса потока
  • Метод Thread.setName()

2.1 Использование конструктора потоков

Мы можем использовать один из следующих конструкторов, которые принимают имя потока в качестве параметра.

Thread(String name);Thread(Runnable task, String name);Thread(ThreadGroup group, String name);Thread(ThreadGroup group, Runnable task, String name);

Давайте рассмотрим пример использования конструктора для задания имени потока.

Thread thread = new Thread(() -> {System.out.println("Thread name is : " + Thread.currentThread().getName()); //Prints "Thread name is : Demo-Thread"}, "Demo-Thread");thread.start();

2.2 Использование Thread.setName()

Метод setName() принимает один аргумент типа string и ничего не возвращает. Этот метод полезен, если мы не установили имя потока во время создания потока или потоки создаются с использованием синтаксиса стиля lambda.

Thread thread= new Thread(() -> {System.out.println(Thread.currentThread().getName()); //Prints 'Custom-Thread'});oddThread.setName("Custom-Thread");

Аналогично мы можем использовать этот метод и с ExecutorService.

executorService.submit(() -> {Thread.currentThread().setName("Executor-Thread");System.out.println(Thread.currentThread().getName()); //Prints 'Executor-Thread'});

3. Заключение

В этом руководстве мы узнали о разных способах установки нового пользовательского имени для потока. Мы использовали конструктор класса потока и метод setName() того же класса. Аналогично мы использовали getName() для получения имени потока и поняли имена потоков по умолчанию, заданные JVM.

Исходный код на Github

Прокрутить вверх