Comment garder mon programme de vie d'un fil de démon est en cours d'exécution?
J'ai une exigence, que je veux commencer un poller une fois qui se déroulera foreever jusqu'à ce que la machine est redémarrée, ou que le processus est tué. Maintenant, j'ai essayé de démarrer le poller à partir d'une méthode principale à l'aide d'un script shell, mais le problème est que dès que la principale méthode de terminer son exécution, le poller aussi arrêté de travailler, comme je ne suis pas à l'aide de serveurs à atteindre.
J'ai entendu quelque chose à propos de daemon threads
, mais je me demandais comment créer un fil de démon, qui durera pour toujours, et aider mon poller à terme aussi.
Mise à JOUR:
public class SomeThread extends Thread {
@Override
public void run() {
UnitPoller unitPoller = new UnitPoller();
unitPoller.doPolling();
}
public static void main(String[] args) {
SomeThread someThread = new SomeThread();
someThread.setDaemon(true);
someThread.start();
}
}
Ci-dessus est mon jour de classe, maintenant, chaque fois que j'exécute ce fil à partir de la méthode main, il crée un thread, mais dès que l'exécution de la méthode main est terminée, mon poller arrêts de travail, la machine s'arrête.
Avec ce problème, que dois-je faire.
Grâce
OriginalL'auteur M.J. | 2011-06-27
Vous devez vous connecter pour publier un commentaire.
Que vous venez de créer un thread et appel
th.setDaemon(true)
avant d'appelerth.start()
.Edit:
Ci-dessus répond à la question "comment créer un fil de démon", mais (dans le champ de la question a changé), une bonne réponse serait: de ne pas créer un fil de démon si vous voulez que votre fil de garder la JVM de quitter une fois que le thread principal terminé.
La JavaDoc de
Thread.setDaemon()
dit: "La Machine Virtuelle Java se ferme lorsque la seule threads en cours d'exécution sont tous les fils de démon". Donc, si votre fil est un démon, la JVM va quitter. Ce que vous avez besoin est un non-démon fil, si vous voulez garder la JVM en cours d'exécution.Comment supprimer les éléments de réponse qui s'est avéré être incorrecte après la question a été clarifiée?
OriginalL'auteur Costi Ciudatu
1) Vous devez
someThread.setDaemon(false)
au lieu de "vrai". Un fil de démon actuellement n'arrête PAS de java de s'arrêter.De la javadoc:
2) je pense que ce n'est pas votre principal, mais votre méthode run() qui se termine bientôt. Essayer de mettre un while (true) boucle autour de votre doPolling méthode.
3) C'est plus propre pour appeler
join()
à l'intérieur de la principale, puis de s'appuyer sur le fil de démon comportement.4) Si vous avez besoin d'un moyen propre à arrêter le deamonthread. Envisager la mise en œuvre InterruptedException pour quitter les bureaux de la tâche. Vous pouvez également utiliser le fermeture à crochet.
OriginalL'auteur Dorus
Le terme "fil de démon" en Java est un peu trompeur, car il signifie vraiment "que le thread est pas censé garder la JVM de vie". Cela signifie que la machine s'arrête dès que le dernier non-démon fil de résiliation (comme vous l'avez déjà dit dans votre question).
Ce que vous êtes peut-être à la recherche pour le Apache Commons Daemon projet, qui permet de créer une belle "services système", a commencé par
/etc/init.d/
les entrées et tous les. Cela fonctionne sur Windows et les systèmes *nix.OriginalL'auteur Waldheinz