2009-05-19 6 views
7

Je dois trouver un moyen de retirer un thread d'un appel statique et de ne pas attendre que le thread se termine. Fondamentalement, une approche "fire and forget". Quelqu'un peut-il me fournir un exemple simple de la façon dont cela peut être accompli?Java, n'attendez pas la fin d'un thread

+3

C'est essentiellement le comportement par défaut d'un thread - ce thread va-t-il avoir besoin de signaler le thread de répartition à un moment donné ou de changer l'état d'une variable partagée? Plus de détails serait bien. – Gandalf

Répondre

26
Thread t = new Thread(new YourClassThatImplementsRunnable()); 
t.start(); 

// JDK 8 
new Thread(() -> methodYouWantToRun()).start(); 
7
public static void foo() { 
    new Thread() { 
     public void run() { 
        //do something here.... 
     } 
    }.start(); 
} 
+2

Mais si la tâche est relativement simple, utilisez le constructeur Runnable pour Thread (c'est-à-dire, nouveau Thread (nouveau Runnable() {public void run() {...}})), car de cette façon vous ne prolongez pas classe compliquée, mais implémentant une interface, ce qui devrait être plus simple dans le bytecode et vous n'aurez aucun conflit de noms avec les méthodes de Thread. – Gracenotes

2

commencent essentiellement le fil et à ne pas se joindre à accomplir un. Donc vous n'attendrez pas le fil pour finir.

8

Si c'est un fil à long terme qui a un cycle de vie similaire à votre application elle-même, et va passer beaucoup de son temps d'attente sur d'autres sujets:

new Thread(new yourLongRunningProcessThatImplementsRunnable()).start(); 

Si c'est une courte durée , la tâche CPU liée:

ExecutorService es = Executors.newFixedThreadPool(Runtime.availableProcessors()); 
es.submit(new yourTaskThatImplementsRunnable()); 

Bien que, dans la plupart des cas comme celui-ci, vous enverrez un certain nombre de tâches à ce même ExecutorService.

Voir:

5

En fonction de la nature de votre tâche, de différentes manières peut être appropriée envers:

(1) Comme beaucoup l'ont dit, d'une manière commune pour une tâche occasionnelle est simplement de construire un fil et appeler son départ() méthode. (2) N'oubliez pas que si votre thread d'arrière-plan ne s'arrête pas, il empêchera par défaut votre programme de s'arrêter lorsque les autres threads seront terminés. Vous pouvez donc vouloir appeler setDaemon (true) sur le thread de sorte qu'il n'a pas ce comportement. (Dans les applications basées sur l'interface graphique, en revanche, vous finissez généralement par simplement appeler System.exit(), et idéalement, vous allez ajouter à votre tâche de longue durée une manière de fermer.)

(3) Si vous avez souvent des tâches de courte durée pour "tirer et oublier", alors pensez à utiliser le Executors framework disponible à partir de Java 5.

+0

C'est génial, merci. – eric2323223

Questions connexes