Когда используются потоки демона?
Я знаю, что потоки фоновых потоков Deamon. Мы можем создать собственный поток демона, вызвав setDaemon(true)
.
Мой вопрос: зачем и когда нам нужно создать наш поток в качестве потока демона?
Ответы
Ответ 1
JVM выходит, когда все запущенные потоки являются потоками демона. Представьте, что вы пишете простую игру, где ваш основной метод пеет, пока вы не решите выйти. И представьте, что в начале игры вы начинаете поток, который будет бесконечно опробовать какой-то веб-сайт, чтобы вызывать предупреждения. Вы хотели бы, чтобы JVM выходил, когда вы решили закончить игру. Вы не хотите, чтобы бесконечный опрос препятствовал завершению игры. Таким образом, вы делаете этот поток опроса потоком демона.
Ответ 2
Демона Deamon автоматически заканчивается JVM, когда все "нормальные" потоки прекращаются. Обычные нити никогда не прекращаются автоматически.
Ответ 3
Службы, которые вы хотите предложить своим потребителям без какого-либо вмешательства пользователя посредством по существу пользовательских потоков, образуют основной прецедент для установки пользовательского потока в качестве демона.
Как следствие, пока пользовательские потоки не будут существовать JVM-gurantees, потоки демонов будут выполняться непрерывно. Вы можете найти примеры, такие как GC, UI Thread и т.д. Это демоны.
Надеюсь, что это поможет.
Ответ 4
Как указывали другие, поток демона не предотвращает выход JVM, когда программа заканчивается, когда этот поток все еще работает.
В общем, вам лучше не создавать потоки демона, если вы не уверены, что поток не имеет побочных эффектов. Поскольку вы не можете сказать, когда поток остановлен, блоки финализатора не запускаются, и ни один из них не разматывается. Поэтому старайтесь избегать использования операций ввода-вывода в потоках демона, поскольку он может испортить данные.
Ответ 5
Обычно программа заканчивается, когда все ее потоки выходят из своего метода run()
. Нити Daemon не препятствуют завершению работы программы, даже если они все еще запущены, то есть выполняют run()
.
Итак, вы должны использовать поток демона, если вы не хотите препятствовать завершению работы программы, когда поток все еще работает. Это типично, например, для долговременных периодических задач, но на самом деле сильно зависит от вашей программы, вашего дизайна и вашего вкуса.
Ответ 6
Я использовал их с Timer для удаления файлов, которые нельзя удалить сразу. То есть я создаю файлы .exe, запускаю и удаляю их. Но есть 50% вероятность того, что executable.delete
не удастся, по-видимому, потому что изображение по-прежнему заблокировано процессом в завершении. Вы можете надежно удалить исполняемый образ только после завершения процесса. Но вы никогда не знаете, сколько времени потребуется. Поэтому вы устанавливаете .deleteOnExit, а не .delete. Но вы не хотите ждать, пока машина Java перестанет работать. Это может занять очень много времени, и вам не нужны миллионы бесполезных глупых файлов .exe, которые вам больше не нужны, висящие в файловой системе. Поэтому вы планируете выполнить executable.delete в таймере, чтобы произойти через одну-две секунды позже. Однако таймер не может быть обычной нитью. Если это так, это заблокирует вашу программу от завершения, даже если нет файлов для удаления. Я могу легко сделать это daemon, однако, потому что ли мои файлы удалены или нет по таймеру, не имеет значения - файлы будут удалены в любом случае: либо с помощью демона, либо из java-выхода. Я думаю, что это идеальное использование демона.
Ответ 7
Темы Daemon в Java похожи на поставщиков услуг для других потоков или объектов, работающих в том же процессе, что и поток демона. Потоки Daemon используются для поддержки фоновых задач и необходимы только при выполнении обычных потоков. Если нормальные потоки не выполняются, а оставшиеся потоки являются потоками демона, то интерпретатор завершает работу.
Когда создается новый поток, он наследует статус демона своего родителя. Обычные нити и потоки демонов отличаются тем, что происходит, когда они выходят. Когда JVM останавливает все оставшиеся потоки демона, заброшены: наконец, блоки не выполняются, стеки не разматываются - JVM просто выходит. По этой причине потоки демона должны использоваться сдержанно, и их опасно использовать для задач, которые могут выполнять любые операции ввода-вывода.