[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-mozhno-li-sdelat-osnovnoy-potok-programmy-demonom":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":19,"progress":20,"seo":21},254,"mozhno-li-sdelat-osnovnoy-potok-programmy-demonom",8,"mnogopotochnost","Многопоточность","🔀","Можно ли сделать основной поток программы демоном?","\u003C!-- grade: 4\u002F5 — ответ правильный, но слишком краткий -->\n\n**Нет, основной поток (`main`) нельзя сделать демоном.** Вызов `Thread.currentThread().setDaemon(true)` в методе `main()` выбросит `IllegalThreadStateException`, потому что поток уже запущен, а `setDaemon()` можно вызвать только до вызова `start()`.\n\n### Почему это невозможно\n\nМетод `setDaemon()` проверяет состояние потока и выбрасывает исключение, если поток уже alive:\n\n```java\n\u002F\u002F Упрощённый исходный код Thread.setDaemon()\npublic final void setDaemon(boolean on) {\n    checkAccess();\n    if (isAlive()) {\n        throw new IllegalThreadStateException();\n    }\n    daemon = on;\n}\n```\n\nК моменту, когда выполняется код в `main()`, основной поток уже запущен, поэтому `isAlive()` возвращает `true`.\n\n### Почему это концептуально бессмысленно\n\nДаже если бы технически это было возможно, превращение `main` в демон привело бы к немедленному завершению JVM: если бы `main` был единственным потоком и являлся демоном, JVM не имела бы пользовательских потоков и завершилась бы, не выполнив ни одной строки кода (или завершилась бы сразу после создания пользовательских потоков, если больше нет других не-демонов).\n\n> **Аналогия из жизни.** Основной поток -- это директор офиса. Сделать директора «фоновым обслуживающим персоналом» нельзя: без директора офис просто не откроется.\n\n> **На собеседовании.** Краткий и точный ответ: «Нет, потому что `setDaemon()` можно вызвать только до `start()`, а `main`-поток уже запущен.» Если хотите показать глубину, добавьте: «К тому же, это концептуально бессмысленно -- если `main` был бы демоном и единственным потоком, JVM немедленно завершилась бы.»","","junior",[15,16,17,18],"main","Thread","concurrency","daemon",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":31,"featuredSnippetReady":32},"Можно ли сделать main-поток демоном в Java — Gymterview","Нет, основной поток нельзя сделать демоном. Потоки-демоны обслуживают основные потоки и не могут существовать без них.","Основной поток — демон? Нет!","Основной поток (main) нельзя сделать демоном. Демоны обслуживают основные потоки и не могут существовать без них.",[27,28,29,30],"main поток демон Java","основной поток daemon","setDaemon main thread","можно ли main демон","Нет. Потоки-демоны описывают фоновые процессы для обслуживания основных потоков выполнения и не могут существовать без них.",true]