[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-potoki-demony":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},253,"chto-takoe-potoki-demony",8,"mnogopotochnost","Многопоточность","🔀","Что такое потоки-демоны?","\u003C!-- grade: 4\u002F5 — основная суть раскрыта, но мало деталей -->\n\n**Поток-демон (daemon thread)** -- это служебный поток, работающий в фоновом режиме для обслуживания основных (пользовательских) потоков. Ключевое свойство: JVM завершает работу, когда все **не-демон** потоки завершились, даже если потоки-демоны ещё работают. Демон-потоки принудительно уничтожаются при завершении JVM.\n\n### Управление демон-статусом\n\n```java\n\u002F\u002F Установить поток как демон (ОБЯЗАТЕЛЬНО до вызова start())\nthread.setDaemon(true);\nthread.start();\n\n\u002F\u002F Проверить, является ли поток демоном\nboolean isDaemon = thread.isDaemon();\n```\n\n### Примеры потоков-демонов в JVM\n\n| Поток-демон | Назначение |\n|---|---|\n| Garbage Collector | Сборка мусора |\n| Finalizer thread | Выполнение метода `finalize()` |\n| Signal Dispatcher | Обработка сигналов ОС |\n| Reference Handler | Обработка слабых\u002Fфантомных ссылок |\n\n### Важные правила\n\n1. **`setDaemon()` до `start()`** -- вызов после старта потока выбросит `IllegalThreadStateException`.\n2. **Наследование статуса** -- дочерний поток наследует демон-статус от родительского потока. Если демон-поток создаёт новый поток, тот тоже будет демоном.\n3. **Нельзя полагаться на завершение** -- блоки `finally` и shutdown hooks **не гарантированно** выполнятся в демон-потоках при остановке JVM. Поэтому в демон-потоках нельзя выполнять критические операции (запись в файл, закрытие соединений с БД, коммит транзакций).\n4. **Основной поток** -- поток `main` всегда является пользовательским потоком. Его нельзя сделать демоном (подробнее в следующем вопросе).\n\n\u003Cdetails>\n\u003Csummary>Пример: демон-поток завершается при окончании main\u003C\u002Fsummary>\n\n```java\npublic class DaemonDemo {\n    public static void main(String[] args) {\n        Thread daemon = new Thread(() -> {\n            while (true) {\n                System.out.println(\"Демон работает...\");\n                try { Thread.sleep(500); } catch (InterruptedException e) { return; }\n            }\n        });\n        daemon.setDaemon(true);\n        daemon.start();\n\n        \u002F\u002F Основной поток работает 2 секунды и завершается\n        try { Thread.sleep(2000); } catch (InterruptedException e) { }\n        System.out.println(\"Main завершился — JVM останавливается, демон уничтожен\");\n        \u002F\u002F После завершения main JVM принудительно остановит демон-поток\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n> **Аналогия из жизни.** Поток-демон -- это уборщик в офисе: он работает, пока есть сотрудники. Когда последний сотрудник уходит и здание закрывается, уборщик тоже уходит, даже если не закончил уборку. Нельзя поручать уборщику запирать сейф -- он может не успеть.\n\n> **На собеседовании.** Ключевые моменты: (1) JVM завершается, когда не осталось пользовательских потоков, демоны не учитываются; (2) `setDaemon(true)` обязательно до `start()`; (3) не выполняйте в демон-потоках работу, требующую гарантированного завершения. Типичный подвопрос: «Какой пример демон-потока в JVM?» -- Garbage Collector.","","junior",[15,16,17,18,19],"setDaemon","фоновый поток","Thread","concurrency","daemon",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":32,"featuredSnippetReady":33},"Потоки-демоны в Java — setDaemon, isDaemon — Gymterview","Потоки-демоны работают в фоне и обслуживают основные потоки. JVM завершает демонов автоматически после окончания работы main. setDaemon(true) до start().","Потоки-демоны — фоновые потоки в Java","Потоки-демоны обслуживают основные потоки и завершаются автоматически при окончании main(). Устанавливаются через setDaemon(true) до запуска.",[28,29,30,31],"потоки-демоны Java","daemon thread Java","setDaemon Java","фоновый поток Java","Потоки-демоны работают в фоновом режиме и обслуживают основные потоки приложения. JVM может завершить демон-поток при окончании main(), не дожидаясь его завершения. Устанавливается вызовом setDaemon(true) до start(). Проверка — isDaemon().",true]