Кто-нибудь может сказать мне, что потоки демона в Java ?
java
multithreading
коромысло
источник
источник
Thread
Javadoc описывает то , что они: java.sun.com/javase/6/docs/api/java/lang/Thread.htmlОтветы:
Поток демона - это поток, который не препятствует выходу JVM после завершения программы, но поток все еще работает. Примером потока демона является сборщик мусора.
Вы можете использовать
setDaemon(boolean)
метод для измененияThread
свойств демона до запуска потока.источник
setDamon(boolean)
может быть вызван только до того, как поток был начат. По умолчанию поток наследует статус демона своего родительского потока.thread that does not prevent the JVM from exiting when the program finishes but the thread is still running
основном означает, что процесс JVM, который запустил поток, не заботится о том, завершил ли выполнение поток демона или нет, он просто завершится сам, если все нормальные потоки закончили выполнение.Еще несколько моментов (Ссылка: Java Concurrency in Practice )
Когда все потоки, не являющиеся демонами, заканчивают работу, JVM останавливается, а все оставшиеся потоки демонов удаляются :
По этой причине потоки демона следует использовать с осторожностью, и их опасно использовать для задач, которые могут выполнять любые операции ввода-вывода.
источник
finally
блоки не выполняются, независимо от того, являются ли потоки демонами или нет. Так что не звоните,System.exit(…)
если вы думаете, что могут быть запущенные потоки, делающие ввод / вывод. Единственное отличие состоит в том, что JVM будет запускать свое собственное завершение, когда остаются только потоки демона.Все вышеприведенные ответы хороши. Вот небольшой фрагмент кода, чтобы проиллюстрировать разницу. Попробуйте это с каждым из значений true и false in
setDaemon
.источник
Традиционно демон-процессы в UNIX были такими, которые постоянно работали в фоновом режиме, во многом как сервисы в Windows.
Поток демона в Java - тот, который не препятствует выходу JVM. В частности, JVM завершит работу, когда останутся только потоки демона. Вы создаете его, вызывая
setDaemon()
методThread
.Прочитайте темы Демона .
источник
Потоки демона подобны поставщикам услуг для других потоков или объектов, работающих в том же процессе, что и поток демона. Потоки демона используются для фоновых задач поддержки и необходимы только во время выполнения обычных потоков. Если нормальные потоки не запущены, а остальные потоки являются потоками демона, интерпретатор завершает работу.
Например, браузер HotJava использует до четырех потоков демонов с именем «Сборщик изображений» для извлечения изображений из файловой системы или сети для любого потока, который в этом нуждается.
Потоки демона обычно используются для выполнения сервисов для вашего приложения / апплета (например, загрузка «битов фиддли»). Основное различие между пользовательскими потоками и потоками демонов состоит в том, что JVM закроет программу только после завершения всех пользовательских потоков. Потоки демона завершаются JVM, когда пользовательские потоки больше не работают, включая основной поток выполнения.
setDaemon (true / false)? Этот метод используется, чтобы указать, что поток является потоком демона.
public boolean isDaemon ()? Этот метод используется для определения того, является ли поток потоком демона или нет.
Например:
Вывод:
источник
Определение демона (вычислений):
—— Источник: английский от Оксфордских словарей
Что такое поток демонов в Java?
источник
Демон поток является потоком , который считается делать некоторые задачи в фоновом режиме , таких как обработка запросов или различных chronjobs , которые могут существовать в приложении.
Когда в вашей программе остались только потоки демонов, она завершится. Это потому, что обычно эти потоки работают вместе с обычными потоками и обеспечивают фоновую обработку событий.
Вы можете указать, что a
Thread
является демоном , используяsetDaemon
метод, они обычно не выходят, и они не прерываются ... они просто останавливаются, когда приложение останавливается.источник
Одно заблуждение я хотел бы уточнить:
источник
Демоническая и пользовательская темы. Обычно все потоки, созданные программистом, являются пользовательскими (если вы не укажете, что это демон, или ваш родительский поток не является потоком демона). Пользовательский поток обычно предназначен для запуска нашего программного кода. JVM не завершается, если не завершен весь поток пользователя.
источник
У Java есть специальный вид потока, называемый потоком демона .
Для чего используются потоки демонов?
Обычно используется в качестве поставщиков услуг для обычных потоков. Обычно есть бесконечный цикл, который ожидает запрос на обслуживание или выполняет задачи потока. Они не могут выполнять важную работу. (Потому что мы не знаем, когда у них будет процессорное время, и они могут закончить в любое время, если другие потоки не запущены.)
Типичным примером такого рода потоков является сборщик мусора Java .
Есть больше...
setDaemon()
метод только перед вызовомstart()
метода. Когда поток запущен, вы не можете изменить его состояние демона.isDaemon()
метод, чтобы проверить, является ли поток потоком демона или потоком пользователя.источник
Нити демонов похожи на помощников. Non-Daemon темы как фронт-исполнители. Помощники помогают исполнителям завершить работу. Когда работа завершена, исполнители больше не нуждаются в помощи. Поскольку помощь не требуется, помощники покидают это место. Поэтому, когда задания потоков, не являющихся демонами, заканчиваются, потоки демонов удаляются.
источник
Поток демона аналогичен обычному потоку, за исключением того, что JVM отключается только тогда, когда другие потоки, не являющиеся демонами, не существуют. Потоки демонов, как правило, используются для предоставления сервисов для вашего приложения.
источник
Поток демона в Java - это поток, который работает в фоновом режиме и в основном создается JVM для выполнения фоновых задач, таких как сборка мусора и другие домашние задачи.
Указывает на Примечание:
Любой поток, созданный основным потоком, который выполняет основной метод в Java, по умолчанию не является демоном, поскольку поток наследует свою природу демона от потока, который его создает, т.е. родительский поток, а поскольку основной поток является потоком, не являющимся демоном, любой другой поток, созданный из него оставаться не-демоном до тех пор, пока он не будет явно создан, вызывая setDaemon (true).
Thread.setDaemon (true) создает демон Thread, но его можно вызвать только перед запуском Thread в Java. Он выдаст исключение IllegalThreadStateException, если соответствующий поток уже запущен и работает.
Разница между потоками Daemon и Non Daemon в Java:
1) JVM не ожидает завершения работы какого-либо потока демона перед его созданием.
2) Поток демона обрабатывается иначе, чем пользовательский поток, когда JVM завершается, наконец, блоки не вызываются, стеки не разматываются, а JVM просто выходит.
источник
В Java потоки Daemon являются одним из типов потока, который не препятствует выходу виртуальной машины Java (JVM). Основная цель потока демона - выполнить фоновую задачу, особенно в случае какой-либо рутинной периодической задачи или работы. С выходами JVM поток демона также умирает.
При установке a
thread.setDaemon(true)
поток становится потоком демона. Однако вы можете установить это значение только до начала потока.источник
Вот пример для тестирования поведения потоков демона в случае выхода из jvm из-за отсутствия пользовательских потоков.
Пожалуйста , обратите внимание , вторые последнюю строку на выход ниже, когда основной поток вышел, демон нить также умерла и не печатала , наконец executed9 заявления в конце концов блока. Это означает, что любые ресурсы ввода-вывода, закрытые в блоке finally потока демона, не будут закрыты, если JVM завершит работу из-за отсутствия пользовательских потоков.
Вывод
источник
Потоки демонов, как все объяснили, не будут ограничивать выход из JVM, так что в основном это счастливый поток для Application с точки зрения выхода.
Хочу добавить, что потоки демона можно использовать, когда, скажем, я предоставляю такой API, как отправка данных на сторонний сервер или JMS, мне может потребоваться агрегировать данные на уровне клиентской JVM и затем отправлять их в JMS в отдельном потоке. Я могу сделать этот поток потоком демона, если это не обязательные данные для отправки на сервер. Этот тип данных похож на журнал регистрации / агрегации.
С уважением, Маниш
источник
Поток демона похож на процесс демона, который отвечает за управление ресурсами, виртуальная машина Java создает поток демона для обслуживания пользовательских потоков. пример обновления системы для unix, unix - это процесс-демон. Дочерний поток демона всегда является потоком демона, поэтому по умолчанию он имеет значение false. Вы можете проверить поток как демон или пользователь, используя метод isDaemon (). поэтому поток демона или процесс демона в основном отвечают за управление ресурсами. например, когда вы запускаете jvm, запускается сборщик мусора, который является потоком демона с приоритетом 1, который является самым низким, который управляет памятью. jvm жив, пока жив пользовательский поток, вы не можете уничтожить поток демона. jvm отвечает за уничтожение потоков демона.
источник
Поговорим только в коде с рабочими примерами. Мне нравится ответ Русса выше, но чтобы убрать любые сомнения, я немного их улучшил. Я запускал его дважды, один раз с рабочим потоком, установленным в deamon true (поток deamon), а в другой раз установил его в false (пользовательский поток). Это подтверждает, что поток deamon заканчивается, когда заканчивается основной поток.
источник
Потоки демонов обычно называются потоками «Service Provider». Эти потоки должны использоваться не для выполнения программного кода, а для системного кода. Эти потоки работают параллельно вашему коду, но JVM может уничтожить их в любое время. Когда JVM не находит пользовательских потоков, он останавливает его, и все потоки демона мгновенно завершаются. Мы можем установить поток, не являющийся демоном, в демон, используя:
источник
Потоки демона - это потоки, которые работают в фоновом режиме, пока другие потоки процесса, не являющиеся демонами, все еще работают. Таким образом, когда все потоки, не являющиеся демонами, завершаются, потоки демонов завершаются. Примером потока, не являющегося демоном, является поток, выполняющий Main. Поток становится демоном, вызывая
setDaemon()
метод до запуска потокаДля дополнительной справки: Демоническая нить в Java
источник
Для меня нить демона это как экономка для пользовательских тем. Если все пользовательские потоки завершены, поток демонов не имеет работы и уничтожен JVM. Я объяснил это в видео на YouTube .
источник
JVM выполнит работу, когда завершится выполнение последнего потока, не являющегося демоном. По умолчанию JVM создает поток как не-демон, но мы можем сделать поток как демон с помощью метода
setDaemon(true)
. Хорошим примером потока Daemon является поток GC, который завершит свою работу, как только будут завершены все потоки, не являющиеся демонами.источник
Нити демона умирают при выходе из нити создателя.
Потоки, не являющиеся демонами (по умолчанию), могут даже жить дольше, чем основной поток.
источник
join
, демон будет оставаться до тех пор, пока работает основной поток.