Qualcuno può dirmi quali thread demone sono in Java ?
Qualcuno può dirmi quali thread demone sono in Java ?
Risposte:
Un thread daemon è un thread che non impedisce alla JVM di uscire al termine del programma ma il thread è ancora in esecuzione. Un esempio per un thread daemon è la garbage collection.
È possibile utilizzare il setDaemon(boolean)
metodo per modificare le Thread
proprietà del demone prima dell'avvio del thread.
setDamon(boolean)
può essere chiamato solo prima che il thread sia stato avviato. Per impostazione predefinita, il thread eredita lo stato daemon del thread principale.
thread that does not prevent the JVM from exiting when the program finishes but the thread is still running
pratica significa che il processo JVM che ha avviato il thread non ha importanza se il thread del demone ha terminato l'esecuzione o meno, si concluderà automaticamente se tutti i thread normali hanno terminato l'esecuzione.
Alcuni altri punti (Riferimento: Concorrenza Java in pratica )
Al termine di tutti i thread non daemon, JVM si interrompe e tutti i thread daemon rimanenti vengono abbandonati :
Per questo motivo i thread demone devono essere usati con parsimonia, ed è pericoloso usarli per attività che potrebbero eseguire qualsiasi tipo di I / O.
finally
blocco viene eseguito, indipendentemente dal fatto che i thread siano demoni o meno. Quindi non chiamare System.exit(…)
se pensi che potrebbero esserci thread in esecuzione che eseguono I / O. L'unica differenza è che JVM attiverà la propria terminazione quando rimangono solo thread daemon.
Tutte le risposte sopra sono buone. Ecco un piccolo frammento di codice, per illustrare la differenza. Provalo con ciascuno dei valori di true e 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
}
}
}
}
Tradizionalmente i processi daemon in UNIX erano quelli che erano costantemente in esecuzione in background, proprio come i servizi in Windows.
Un thread daemon in Java è uno che non impedisce alla JVM di uscire. In particolare, la JVM verrà chiusa quando rimangono solo thread daemon. Ne crei uno chiamando il setDaemon()
metodo Thread
.
I thread daemon sono come provider di servizi per altri thread o oggetti in esecuzione nello stesso processo del thread daemon. I thread daemon vengono utilizzati per attività di supporto in background e sono necessari solo durante l'esecuzione dei thread normali. Se i thread normali non sono in esecuzione e i thread rimanenti sono thread daemon, allora l'interprete esce.
Ad esempio, il browser HotJava utilizza fino a quattro thread demone denominati "Image Fetcher" per recuperare immagini dal file system o dalla rete per qualsiasi thread che ne abbia bisogno.
I thread daemon vengono generalmente utilizzati per eseguire servizi per l'applicazione / l'applet (ad esempio il caricamento dei "bit di fiddley"). La differenza principale tra thread utente e thread demone è che JVM chiuderà un programma solo quando tutti i thread utente saranno terminati. I thread daemon vengono terminati da JVM quando non ci sono più thread utente in esecuzione, incluso il thread principale di esecuzione.
setDaemon (true / false)? Questo metodo viene utilizzato per specificare che un thread è thread daemon.
pubblico booleano isDaemon ()? Questo metodo viene utilizzato per determinare se il thread è thread demone o meno.
Per esempio:
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");
}
}
Produzione:
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>
Un processo in background che gestisce le richieste di servizi come lo spooling di stampa e i trasferimenti di file ed è inattivo quando non richiesto.
—— Fonte: inglese dei dizionari di Oxford
Un thread daemon è un thread che viene considerato svolgere alcune attività in background come la gestione di richieste o vari chronjob che possono esistere in un'applicazione.
Quando il tuo programma ha solo thread demone rimanenti, verrà chiuso. Questo perché di solito questi thread lavorano insieme ai thread normali e forniscono la gestione in background degli eventi.
Puoi specificare che a Thread
è un demone usando il setDaemon
metodo, di solito non escono, né sono interrotti .. si fermano appena quando l'applicazione si ferma.
Un malinteso che vorrei chiarire:
Discussione Daemon e Discussioni utente. Generalmente tutti i thread creati dal programmatore sono thread utente (a meno che non lo specifichi come demone o il tuo thread padre sia un thread demone). Il thread utente generalmente intende eseguire il nostro codice di programma. JVM non termina a meno che non venga interrotto tutto il thread utente.
Java ha un tipo speciale di thread chiamato thread demone .
A cosa servono i thread daemon?
Normalmente utilizzato come provider di servizi per thread normali. Di solito hanno un ciclo infinito che attende la richiesta di servizio o esegue le attività del thread. Non possono fare lavori importanti. (Perché non sappiamo quando avranno il tempo della CPU e possono finire in qualsiasi momento se non ci sono altri thread in esecuzione.)
Un tipico esempio di questo tipo di thread è il Garbage Collector Java .
C'è più...
setDaemon()
metodo solo prima di chiamare il start()
metodo. Una volta che il thread è in esecuzione, non è possibile modificarne lo stato daemon.isDaemon()
metodo per verificare se un thread è un thread daemon o un thread utente.I thread dei demoni sono come assistenti. I thread non Daemon sono come i front performer. Gli assistenti aiutano gli artisti a completare un lavoro. Quando il lavoro è completato, gli artisti non hanno più bisogno di aiuto per esibirsi. Poiché non è necessario alcun aiuto, gli assistenti lasciano il posto. Quindi, quando i lavori dei thread non Daemon sono finiti, i thread Daemon marciano via.
I thread daemon in Java sono quei thread che vengono eseguiti in background e principalmente creati da JVM per eseguire attività in background come Garbage Collection e altre attività di pulizia domestica.
Punti da notare:
Qualsiasi thread creato dal thread principale, che esegue il metodo principale in Java, per impostazione predefinita, non è un demone poiché Thread eredita la sua natura daemon dal thread che lo crea, ovvero il thread principale e poiché il thread principale è un thread non daemon, qualsiasi altro thread creato da esso verrà rimane non daemon fino a quando non viene creato esplicitamente un demone chiamando setDaemon (true).
Thread.setDaemon (true) crea un demone Thread ma può essere chiamato solo prima di avviare Thread in Java. Genera IllegalThreadStateException se il thread corrispondente è già avviato e in esecuzione.
Differenza tra thread Daemon e non Daemon in Java:
1) JVM non aspetta che un thread demone finisca prima di esistere.
2) Daemon Thread viene trattato in modo diverso rispetto a User Thread quando JVM termina, infine i blocchi non vengono chiamati, gli stack non vengono srotolati e JVM esce.
In Java, Daemon Threads è uno dei tipi di thread che non impedisce la chiusura di Java Virtual Machine (JVM). Lo scopo principale di un thread daemon è quello di eseguire attività in background, specialmente in caso di attività o lavori periodici di routine. Con l'uscita di JVM, muore anche il thread demone.
Impostando a thread.setDaemon(true)
, un thread diventa un thread demone. Tuttavia, è possibile impostare questo valore solo prima dell'inizio del thread.
Ecco un esempio per testare il comportamento dei thread demone in caso di uscita jvm a causa della non esistenza di thread utente.
Nota la seconda ultima riga nell'output di seguito, quando il thread principale è uscito, anche il thread daemon è morto e non ha stampato l' istruzione finalmente eseguita9 all'interno del blocco finally. Ciò significa che eventuali risorse di I / o chiuse all'interno del blocco di un thread daemon non verranno chiuse se JVM esce a causa della non esistenza di thread utente.
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
I thread dei demoni sono come tutti hanno spiegato, non vincoleranno l'uscita di JVM, quindi sostanzialmente è un thread felice per l'applicazione dal punto di vista dell'uscita.
Vorrei aggiungere che i thread daemon possono essere usati quando dico che sto fornendo un'API come il push dei dati su un server di terze parti / o JMS, potrei aver bisogno di aggregare i dati a livello di client JVM e quindi inviarli a JMS in un thread separato. Posso creare questo thread come thread daemon, se non si tratta di un dato obbligatorio da inviare al server. Questo tipo di dati è come il push / aggregazione dei log.
Saluti, Manish
Il thread daemon è come il processo daemon che è responsabile della gestione delle risorse, un thread daemon viene creato dalla VM Java per servire i thread utente. esempio di aggiornamento del sistema per unix, unix è un processo daemon. il figlio del thread del daemon è sempre il thread del daemon, quindi per impostazione predefinita il daemon è false. È possibile controllare il thread come daemon o utente utilizzando il metodo "isDaemon ()". quindi il thread daemon o il processo daemon sono sostanzialmente responsabili della gestione delle risorse. per esempio quando avvii jvm c'è un garbage collector in esecuzione che è thread demone la cui priorità è 1 che è la più bassa, che gestisce la memoria. jvm è attivo fintanto che il thread utente è attivo, non è possibile uccidere daemon thread. jvm è responsabile dell'uccisione dei thread daemon.
Parliamo solo di codice con esempi funzionanti. Mi piace la risposta di Russ sopra, ma per rimuovere ogni dubbio che ho avuto, l'ho migliorata un po '. L'ho eseguito due volte, una volta con il thread di lavoro impostato su deamon true (thread deamon) e un'altra volta impostato su false (thread utente). Conferma che il thread Deamon termina quando termina il thread principale.
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
I thread daemon sono generalmente noti come thread "Service Provider". Questi thread non devono essere usati per eseguire il codice del programma ma il codice di sistema. Questi thread sono paralleli al tuo codice ma JVM può ucciderli in qualsiasi momento. Quando JVM non trova thread utente, lo interrompe e tutti i thread demone si interrompono all'istante. Possiamo impostare thread non daemon su daemon usando:
setDaemon(true)
I thread daemon sono thread che vengono eseguiti in background fintanto che altri thread non daemon del processo sono ancora in esecuzione. Pertanto, quando tutti i thread non daemon vengono completati, i thread daemon vengono terminati. Un esempio per il thread non daemon è il thread che esegue Main. Un thread viene creato daemon chiamando il setDaemon()
metodo prima dell'avvio del thread
Per ulteriori riferimenti: thread demone in Java
Per me, il thread demone è come il guardiano di casa per i thread degli utenti. Se tutti i thread utente sono terminati, il thread demone non ha lavoro e viene ucciso da JVM. L'ho spiegato nel video di YouTube .
JVM eseguirà il lavoro quando verrà completata l'ultima esecuzione di thread non daemon. Per impostazione predefinita, JVM creerà un thread come nondaemon, ma possiamo fare Thread come demone con l'aiuto del metodo setDaemon(true)
. Un buon esempio di thread Daemon è il thread GC che completerà il suo lavoro non appena tutti i thread nondaemon saranno completati.
I thread del demone muoiono quando esce il thread del creatore.
I thread non daemon (impostazione predefinita) possono persino vivere più a lungo del thread principale.
if ( threadShouldDieOnApplicationEnd ) {
thread.setDaemon ( true );
}
thread.start();
join
, il daemon rimarrà finché il thread principale verrà eseguito.
Thread
javadoc descrive cosa sono: java.sun.com/javase/6/docs/api/java/lang/Thread.html