В этой статье мы научимся устанавливать и получать имена потоков в 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.