Что такое поток демона в Java?
Кто-нибудь может сказать мне, что потоки демона в Java?
31 ответ
Демоническая нить
Потоки, работающие в фоновом режиме, называются потоками демона.
Пример потоков демона:
- Уборщик мусора.
- Диспетчер сигналов.
Цель демонической нити:
Основная цель потоков демона — обеспечить поддержку потоков, не являющихся демонами.
Дополнительная информация о Daemon Thread:
Как правило, потоки демона запускаются в , однако также можно запускать потоки демона.
Пример: Обычно сборщик мусора работает с приоритетом, однако однажды возникает потребность в дополнительной памяти. JVM увеличивает приоритет сборщика мусора с
MIN_PRIORITY
кMAX_PRIORITY
.
После того, как поток был запущен, его нельзя изменить с потока демона на поток не демона, что приведет к
IllegalThreadStateException
.Пример:
public static void main(String[] args) { Thread.currentThread().setDaemon(true); }
Выход:
Exception in thread "main" java.lang.IllegalThreadStateException at java.base/java.lang.Thread.setDaemon(Thread.java:1403)
Если мы разветвляем поток, дочерний поток наследует природу родительского потока. Если родительский поток не является демоном, автоматически дочерний поток также не будет демоном, а если родительский поток является демоном, дочерний поток также будет демоном.
class Scratch { public static void main(String[] args) { CustomThread customThread = new CustomThread(); customThread.start(); } } class CustomThread extends Thread{ @Override public void run() { System.out.println(currentThread().isDaemon()); } }
Выход:
false
Когда завершается последний поток, не являющийся демоном, все потоки демона завершаются автоматически.
class Scratch { public static void main(String[] args) { System.out.println("Main Thread Started."); CustomThread customThread = new CustomThread(); customThread.setDaemon(true); customThread.start(); System.out.println("Main Thread Finished."); } } class CustomThread extends Thread{ @Override public void run() { System.out.println("Custom Thread Started."); try { sleep(2000); } catch (InterruptedException ignore) {} System.out.println("Custom Thread Finished."); //Won't get executed. } }
Выход:
Main Thread Started. Main Thread Finished. Custom Thread Started.