Метод setDaemon
Метод setDaemon класса Thread помечает поток
как демон-поток или, наоборот, как обычный поток пользователя.
В первый параметр мы передаем логическое значение:
true - если поток должен стать демоном,
false - если поток должен быть обычным потоком пользователя.
Демон-потоки автоматически завершаются, когда в программе
не остается ни одного обычного (не демон) потока.
Вызывать метод setDaemon можно только до запуска
потока, то есть до вызова метода start. Если поток
уже запущен, метод выбросит исключение
IllegalThreadStateException. По умолчанию новый поток
является обычным потоком пользователя, то есть демоном не является.
Синтаксис
thread.setDaemon(boolean on)
Пример
Давайте создадим поток, сделаем его демоном и проверим его статус:
public class Main
{
public static void main(String[] args)
{
Thread thread = new Thread(() -> {
System.out.println("Daemon thread is running");
});
thread.setDaemon(true);
thread.start();
System.out.println(thread.isDaemon());
}
}
Результат выполнения кода:
"true"
"Daemon thread is running"
Пример
Давайте посмотрим, что произойдет, если попытаться сделать поток демоном после его запуска:
public class Main
{
public static void main(String[] args)
{
Thread thread = new Thread(() -> {
System.out.println("Thread is running");
});
thread.start();
try
{
thread.setDaemon(true);
}
catch (IllegalThreadStateException e)
{
System.out.println("Cannot set daemon after start");
}
}
}
Результат выполнения кода:
"Thread is running"
"Cannot set daemon after start"
Пример
Давайте сделаем демон-поток, который будет выводить сообщения, и убедимся, что он завершится вместе с основным потоком:
public class Main
{
public static void main(String[] args)
{
Thread daemon = new Thread(() -> {
while (true)
{
System.out.println("Daemon is working");
}
});
daemon.setDaemon(true);
daemon.start();
System.out.println("Main thread is finishing");
}
}
Результат выполнения кода:
"Main thread is finishing"