Может ли кто-нибудь сказать мне, какие потоки демона находятся в Java?
Демон-поток - это поток, который не предотвращает выход JVM, когда программа заканчивается, но поток все еще работает. Примером для потока демона является сбор мусора.
Вы можете использовать метод setDaemon(boolean)
для изменения свойств демона Thread
до начала потока.
setDamon(boolean)
может быть вызван только до того, как поток был запущен. По умолчанию поток наследует состояние демона своего родительского потока.
Еще несколько моментов (Ссылка: Java Concurrency in Practice)
Когда все потоки, не являющиеся демонами, заканчивают работу, JVM останавливается, а все оставшиеся потоки демонов удаляются:
По этой причине потоки демонов следует использовать с осторожностью, и их опасно использовать для задач, которые могут выполнять любые операции ввода-вывода.
Все вышеприведенные ответы хороши. Вот простой небольшой фрагмент кода, чтобы проиллюстрировать разницу. Попробуйте с каждым из значений true и false в 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 a user thread),
// the Worker thread continues to run.
// When true, (i.e. when it 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
.
Прочитайте темы Daemon.
Темы Daemon похожи на поставщиков услуг для других потоков или объектов, работающих в том же процессе, что и поток демона. Потоки Daemon используются для поддержки фоновых задач и необходимы только при выполнении обычных потоков. Если нормальные потоки не выполняются, а оставшиеся потоки являются потоками демона, то интерпретатор завершает работу.
Например, браузер HotJava использует до четырех потоков демона с именем "Image Fetcher" для извлечения изображений из файловой системы или сети для любого потока, который нуждается в нем.
Темы демона обычно используются для выполнения сервисов для вашего приложения/апплета (например, загрузки "фиктивных бит" ). Основное различие между потоками пользователей и потоками демона заключается в том, что JVM будет только закрывать программу, когда все пользовательские потоки прекратятся. Потоки Daemon прерываются 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>
Демон-демона - это поток, который рассматривается как выполняющий некоторые задачи в фоновом режиме, такие как запросы обработки или различные хронограммы, которые могут существовать в приложении.
Когда ваша программа будет иметь только оставшиеся демонные потоки, она выйдет. Это потому, что обычно эти потоки работают вместе с обычными потоками и обеспечивают фоновую обработку событий.
Вы можете указать, что Thread
является демоном с помощью метода setDaemon
, они обычно не выходят, и они не прерываются. Они просто останавливаются, когда приложение останавливается.
Фоновый процесс, который обрабатывает запросы на такие службы, как спулинг печати и передача файлов, и не используется, когда не требуется.
—— Источник: английский от Оксфордских словарей
Одно заблуждение, которое я хотел бы уточнить:
В Java есть специальный поток, называемый потоком daemon.
Для чего используются потоки демона?
Обычно используется как поставщик услуг для обычных потоков. Обычно имеют бесконечный цикл, который ждет запроса на обслуживание или выполняет задачи потока. Они не могут выполнять важные задания. (Потому что мы не знаем, когда у них будет время процессора, и они могут закончить любое время, если нет других потоков.)
Типичным примером такого рода потоков является сборщик мусора Java.
Там больше...
setDaemon()
только после вызова метода start()
. После того, как поток запущен, вы не можете изменить его статус демона.isDaemon()
, чтобы проверить, является ли поток потоком демона или пользовательским потоком.Тема и потоки пользователей Daemon. Как правило, все потоки, созданные программистом, представляют собой пользовательский поток (если вы не укажете его как демона, или ваш родительский поток - поток демона). Пользовательский поток обычно предназначен для запуска нашего программного кода. JVM не завершается, если весь пользовательский поток не завершится.
Демон-потоки подобны помощникам. Нитевидные потоки похожи на передние исполнители. Помощники помогают исполнителям завершить работу. Когда работа завершена, исполнителям больше не нужна помощь. Поскольку помощь не нужна, ассистенты покидают место. Поэтому, когда работы потоков Non-Daemon завершены, потоки Daemon отходят.
поток Daemon в Java - это поток, который работает в фоновом режиме и в основном создается JVM для выполнения фоновой задачи, такой как сборка мусора и другие задачи сохранения дома.
Примечание:
Любой поток, созданный основным потоком, который запускает главный метод в Java, по умолчанию не является демоном, потому что Thread наследует его характер демона от Thread, который создает его, т.е. родительский поток, и поскольку основной поток является потоком не-демона, любой другой поток, созданный из него, останется не-демоном, пока явно не будет сделан демон, вызвав setDaemon (true).
Thread.setDaemon(true) создает демон Thread, но его можно вызвать только после запуска Thread в Java. Он выкинет IllegalThreadStateException, если соответствующий Thread уже запущен и запущен.
Разница между потоком Daemon и Non Daemon в Java:
1) JVM не дожидается завершения любого потока демона до существующего.
2) Демона Thread обрабатываются иначе, чем User Thread, когда JVM завершается, наконец, блоки не вызываются, стеки не разматываются, а JVM просто выходит.
Демонный поток похож на обычный поток, за исключением того, что JVM будет закрыт только тогда, когда другие потоки не-демона не будут существовать. Темы демона обычно используются для выполнения сервисов для вашего приложения.
Темы демона обычно называются потоком "Поставщик услуг". Эти потоки не должны использоваться для выполнения программного кода, но системного кода. Эти потоки выполняются параллельно вашему коду, но JVM может убивать их в любое время. Когда JVM не находит ни одного пользовательского потока, он останавливает его, и все потоки демона немедленно завершаются. Мы можем установить поток не-daemon для демона, используя:
setDaemon(true)
В Java потоки Daemon являются одним из типов потока, который не препятствует выходу Java Virtual Machine (JVM). Основной целью потока демона является выполнение фоновой задачи, особенно в случае некоторой обычной периодической задачи или работы. С выходами JVM поток демонов также умирает.
Установив thread.setDaemon(true)
, поток становится потоком демона. Однако вы можете установить это значение только до начала потока.
поток Daemon похож на процесс daemon, который отвечает за управление ресурсами, поток демона создается виртуальной машиной Java для обслуживания пользовательских потоков. пример системы обновления для unix, unix - процесс демона. child of daemon thread - это всегда поток демона, поэтому по умолчанию daemon is false. Вы можете проверить поток как демон или пользователя с помощью метода isDaemon(). поэтому процесс демона или процесса демон в основном отвечает за управление ресурсами. например, при запуске jvm работает сборщик мусора, который является потоком демона, приоритет которого равен 1, который является самым низким, который управляет памятью. jvm жив до тех пор, пока пользовательский поток жив, u не может убить демона thread.jvm отвечает за уничтожение потоков демона.
Демоны, как все объясняют, не будут ограничивать JVM для выхода, поэтому в основном это счастливый поток для приложения с точки зрения выхода.
Хотите добавить, что потоки демона могут использоваться, когда я предоставляю API, например, толкаю данные на сторонний сервер /JMS, мне может потребоваться агрегировать данные на уровне JVM клиента, а затем отправить в JMS в отдельный поток. Я могу сделать этот поток потоком демона, если это не обязательные данные, которые нужно отправить на сервер. Такие данные подобны логарифмическому нажатию/агрегации.
С уважением, Маниш
run()
для потока демона обычно представляет собой бесконечный цикл, ожидающий запроса на обслуживание. Когда единственными оставшимися потоками процесса являются потоки демона, интерпретатор завершает работу. Это имеет смысл, потому что, когда остаются только потоки демона, нет другого потока, для которого поток демона может предоставить услугу. Чтобы указать, что поток является потоком демона, вызовите метод setDaemon
с аргументом true. Чтобы определить, является ли поток потоком демона, используйте метод isDaemon
.
Надеюсь, это поможет !!!!!!
Потоки Daemon - это потоки, которые выполняются в фоновом режиме, пока другие потоки не-демона процесса все еще работают. Таким образом, когда все потоки не-daemon завершены, потоки демона прекращаются. Примером не-демона является поток, на котором выполняется Main. Нить создается демоном, вызывая метод setDaemon()
до начала потока
Дополнительная ссылка: поток Daemon в Java
JVM выполнит работу, когда завершено выполнение последнего не-демона. По умолчанию JVM создаст поток как nondaemon, но мы можем сделать Thread в качестве демона с помощью метода setDaemon(true)
. Хорошим примером потока Daemon является поток GC, который завершит его работу, как только будут завершены все потоки nondaemon.
Говорите только в коде с рабочими примерами. Мне нравится russ ответить выше, но чтобы устранить любые сомнения, которые у меня были, я немного улучшил его. Я запускал его дважды, один раз, когда рабочий поток был установлен на deamon true (поток деамонов), а другой раз установил его в 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 a user thread),
// the Worker thread continues to run.
// When true, (i.e. when it 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
Для меня, daemon нить это, как house keeper для пользовательских потоков. Если все пользовательские потоки закончены, поток демона не имеет работы и убит JVM. Я объяснил это в видео YouTube.
Ниже приведен пример проверки поведения потоков демона в случае выхода jvm из-за отсутствия пользовательских потоков.
Обратите внимание на вторую последнюю строку на выходе ниже, когда основной поток вышел, поток демона также умер и не распечатывал окончательно выполненную инструкцию в блоке finally. Это означает, что любые ресурсы i/o, закрытые в конечном блоке потока демона, не будут закрыты, если 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
Линии демонов умирают, когда поток создателя завершается.
Ненонные потоки (по умолчанию) могут даже жить дольше, чем основной поток.
if ( threadShouldDieOnApplicationEnd ) {
thread.setDaemon ( true );
}
thread.start();
поток Daemon в java - это поток поставщика услуг, который предоставляет услуги пользовательскому потоку. Его жизнь зависит от милосердия пользовательских потоков, то есть когда все пользовательские потоки умирают, JVM автоматически завершает этот поток.
Единственная цель потока демона заключается в том, что он предоставляет услуги пользовательскому потоку для поддержки фоновой задачи. Если нет пользовательского потока, JVM завершает поток демона.
public class Solution extends Thread {
public static void main(String[] args) {
System.out.println("Main Method Entry");
CrunchifyDaemonThread t = new CrunchifyDaemonThread();
t.setDaemon(true);
t.start();
try {
Thread.sleep(3000);
} catch (InterruptedException x) {
}
System.out.println("Main Method Exit");
}
public void run() {
System.out.println("run Method Entry");
try {
System.out.println("In run Method: currentThread() is"
+ Thread.currentThread());
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException x) {
}
System.out.println("In run method.." + Thread.currentThread());
}
} finally {
System.out.println("run Method Exit");
}
}
}
Thread
Javadoc описывает то , что они: java.sun.com/javase/6/docs/api/java/lang/Thread.html