Кто-нибудь может сказать мне, что потоки демона в Java ?
Кто-нибудь может сказать мне, что потоки демона в Java ?
Ответы:
Поток демона - это поток, который не препятствует выходу 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
.
public class DaemonTest {
public static void main(String[] args) {
new WorkerThread().start();
try {
Thread.sleep(7500);
} catch (InterruptedException e) {
// handle here exception
}
System.out.println("Main Thread ending") ;
}
}
class WorkerThread extends Thread {
public WorkerThread() {
// When false, (i.e. when it's a user thread),
// the Worker thread continues to run.
// When true, (i.e. when it's a daemon thread),
// the Worker thread terminates when the main
// thread terminates.
setDaemon(true);
}
public void run() {
int count = 0;
while (true) {
System.out.println("Hello from Worker "+count++);
try {
sleep(5000);
} catch (InterruptedException e) {
// handle exception here
}
}
}
}
Традиционно демон-процессы в UNIX были такими, которые постоянно работали в фоновом режиме, во многом как сервисы в Windows.
Поток демона в Java - тот, который не препятствует выходу JVM. В частности, JVM завершит работу, когда останутся только потоки демона. Вы создаете его, вызывая setDaemon()
метод Thread
.
Прочитайте темы Демона .
Потоки демона подобны поставщикам услуг для других потоков или объектов, работающих в том же процессе, что и поток демона. Потоки демона используются для фоновых задач поддержки и необходимы только во время выполнения обычных потоков. Если нормальные потоки не запущены, а остальные потоки являются потоками демона, интерпретатор завершает работу.
Например, браузер HotJava использует до четырех потоков демонов с именем «Сборщик изображений» для извлечения изображений из файловой системы или сети для любого потока, который в этом нуждается.
Потоки демона обычно используются для выполнения сервисов для вашего приложения / апплета (например, загрузка «битов фиддли»). Основное различие между пользовательскими потоками и потоками демонов состоит в том, что JVM закроет программу только после завершения всех пользовательских потоков. Потоки демона завершаются JVM, когда пользовательские потоки больше не работают, включая основной поток выполнения.
setDaemon (true / false)? Этот метод используется, чтобы указать, что поток является потоком демона.
public boolean isDaemon ()? Этот метод используется для определения того, является ли поток потоком демона или нет.
Например:
public class DaemonThread extends Thread {
public void run() {
System.out.println("Entering run method");
try {
System.out.println("In run Method: currentThread() is" + Thread.currentThread());
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException x) {}
System.out.println("In run method: woke up again");
}
} finally {
System.out.println("Leaving run Method");
}
}
public static void main(String[] args) {
System.out.println("Entering main Method");
DaemonThread t = new DaemonThread();
t.setDaemon(true);
t.start();
try {
Thread.sleep(3000);
} catch (InterruptedException x) {}
System.out.println("Leaving main method");
}
}
Вывод:
C:\java\thread>javac DaemonThread.java
C:\java\thread>java DaemonThread
Entering main Method
Entering run method
In run Method: currentThread() isThread[Thread-0,5,main]
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
Leaving main method
C:\j2se6\thread>
Фоновый процесс, который обрабатывает запросы на такие службы, как спулинг печати и передача файлов, и бездействует, когда не требуется.
—— Источник: английский от Оксфордских словарей
Демон поток является потоком , который считается делать некоторые задачи в фоновом режиме , таких как обработка запросов или различных chronjobs , которые могут существовать в приложении.
Когда в вашей программе остались только потоки демонов, она завершится. Это потому, что обычно эти потоки работают вместе с обычными потоками и обеспечивают фоновую обработку событий.
Вы можете указать, что a Thread
является демоном , используя setDaemon
метод, они обычно не выходят, и они не прерываются ... они просто останавливаются, когда приложение останавливается.
Одно заблуждение я хотел бы уточнить:
Демоническая и пользовательская темы. Обычно все потоки, созданные программистом, являются пользовательскими (если вы не укажете, что это демон, или ваш родительский поток не является потоком демона). Пользовательский поток обычно предназначен для запуска нашего программного кода. JVM не завершается, если не завершен весь поток пользователя.
У Java есть специальный вид потока, называемый потоком демона .
Для чего используются потоки демонов?
Обычно используется в качестве поставщиков услуг для обычных потоков. Обычно есть бесконечный цикл, который ожидает запрос на обслуживание или выполняет задачи потока. Они не могут выполнять важную работу. (Потому что мы не знаем, когда у них будет процессорное время, и они могут закончить в любое время, если другие потоки не запущены.)
Типичным примером такого рода потоков является сборщик мусора Java .
Есть больше...
setDaemon()
метод только перед вызовом start()
метода. Когда поток запущен, вы не можете изменить его состояние демона.isDaemon()
метод, чтобы проверить, является ли поток потоком демона или потоком пользователя.Нити демонов похожи на помощников. Non-Daemon темы как фронт-исполнители. Помощники помогают исполнителям завершить работу. Когда работа завершена, исполнители больше не нуждаются в помощи. Поскольку помощь не требуется, помощники покидают это место. Поэтому, когда задания потоков, не являющихся демонами, заканчиваются, потоки демонов удаляются.
Поток демона в 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 завершит работу из-за отсутствия пользовательских потоков.
public class DeamonTreadExample {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
int count = 0;
while (true) {
count++;
try {
System.out.println("inside try"+ count);
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
System.out.println("finally executed"+ count);
}
}
});
t.setDaemon(true);
t.start();
Thread.currentThread().sleep(10000);
System.out.println("main thread exited");
}
}
inside try1
finally executed1
inside try2
finally executed2
inside try3
finally executed3
inside try4
finally executed4
inside try5
finally executed5
inside try6
finally executed6
inside try7
finally executed7
inside try8
finally executed8
inside try9
finally executed9
inside try10
main thread exited
Потоки демонов, как все объяснили, не будут ограничивать выход из JVM, так что в основном это счастливый поток для Application с точки зрения выхода.
Хочу добавить, что потоки демона можно использовать, когда, скажем, я предоставляю такой API, как отправка данных на сторонний сервер или JMS, мне может потребоваться агрегировать данные на уровне клиентской JVM и затем отправлять их в JMS в отдельном потоке. Я могу сделать этот поток потоком демона, если это не обязательные данные для отправки на сервер. Этот тип данных похож на журнал регистрации / агрегации.
С уважением, Маниш
Поток демона похож на процесс демона, который отвечает за управление ресурсами, виртуальная машина Java создает поток демона для обслуживания пользовательских потоков. пример обновления системы для unix, unix - это процесс-демон. Дочерний поток демона всегда является потоком демона, поэтому по умолчанию он имеет значение false. Вы можете проверить поток как демон или пользователь, используя метод isDaemon (). поэтому поток демона или процесс демона в основном отвечают за управление ресурсами. например, когда вы запускаете jvm, запускается сборщик мусора, который является потоком демона с приоритетом 1, который является самым низким, который управляет памятью. jvm жив, пока жив пользовательский поток, вы не можете уничтожить поток демона. jvm отвечает за уничтожение потоков демона.
Поговорим только в коде с рабочими примерами. Мне нравится ответ Русса выше, но чтобы убрать любые сомнения, я немного их улучшил. Я запускал его дважды, один раз с рабочим потоком, установленным в deamon true (поток deamon), а в другой раз установил его в false (пользовательский поток). Это подтверждает, что поток deamon заканчивается, когда заканчивается основной поток.
public class DeamonThreadTest {
public static void main(String[] args) {
new WorkerThread(false).start(); //set it to true and false and run twice.
try {
Thread.sleep(7500);
} catch (InterruptedException e) {
// handle here exception
}
System.out.println("Main Thread ending");
}
}
class WorkerThread extends Thread {
boolean isDeamon;
public WorkerThread(boolean isDeamon) {
// When false, (i.e. when it's a user thread),
// the Worker thread continues to run.
// When true, (i.e. when it's a daemon thread),
// the Worker thread terminates when the main
// thread terminates.
this.isDeamon = isDeamon;
setDaemon(isDeamon);
}
public void run() {
System.out.println("I am a " + (isDeamon ? "Deamon Thread" : "User Thread (none-deamon)"));
int counter = 0;
while (counter < 10) {
counter++;
System.out.println("\tworking from Worker thread " + counter++);
try {
sleep(5000);
} catch (InterruptedException e) {
// handle exception here
}
}
System.out.println("\tWorker thread ends. ");
}
}
result when setDeamon(true)
=====================================
I am a Deamon Thread
working from Worker thread 0
working from Worker thread 1
Main Thread ending
Process finished with exit code 0
result when setDeamon(false)
=====================================
I am a User Thread (none-deamon)
working from Worker thread 0
working from Worker thread 1
Main Thread ending
working from Worker thread 2
working from Worker thread 3
working from Worker thread 4
working from Worker thread 5
working from Worker thread 6
working from Worker thread 7
working from Worker thread 8
working from Worker thread 9
Worker thread ends.
Process finished with exit code 0
Потоки демонов обычно называются потоками «Service Provider». Эти потоки должны использоваться не для выполнения программного кода, а для системного кода. Эти потоки работают параллельно вашему коду, но JVM может уничтожить их в любое время. Когда JVM не находит пользовательских потоков, он останавливает его, и все потоки демона мгновенно завершаются. Мы можем установить поток, не являющийся демоном, в демон, используя:
setDaemon(true)
Потоки демона - это потоки, которые работают в фоновом режиме, пока другие потоки процесса, не являющиеся демонами, все еще работают. Таким образом, когда все потоки, не являющиеся демонами, завершаются, потоки демонов завершаются. Примером потока, не являющегося демоном, является поток, выполняющий Main. Поток становится демоном, вызываяsetDaemon()
метод до запуска потока
Для дополнительной справки: Демоническая нить в Java
JVM выполнит работу, когда завершится выполнение последнего потока, не являющегося демоном. По умолчанию JVM создает поток как не-демон, но мы можем сделать поток как демон с помощью метода setDaemon(true)
. Хорошим примером потока Daemon является поток GC, который завершит свою работу, как только будут завершены все потоки, не являющиеся демонами.
Нити демона умирают при выходе из нити создателя.
Потоки, не являющиеся демонами (по умолчанию), могут даже жить дольше, чем основной поток.
if ( threadShouldDieOnApplicationEnd ) {
thread.setDaemon ( true );
}
thread.start();
join
, демон будет оставаться до тех пор, пока работает основной поток.
Thread
Javadoc описывает то , что они: java.sun.com/javase/6/docs/api/java/lang/Thread.html