2009-11-05 7 views
8

J'appelle deux threads à partir d'un thread principal, appelez-les thread 1 et thread 2. Lorsque thread 1 s'arrête, je veux arrêter ou tuer thread 2 également. Comment puis-je faire ceci? Il y a un changement dans la sortie réelle ce que je veux. C'est-à-dire Il y a une classe principale qui est aussi thread.From class j'appelle thread1 et thread2.I donne une entrée à thread1 de la classe principale mais quand cette entrée est changée, je veux tuer le thread1 en cours et le relancer avec une autre entrée. Le second thread, thread2, tournera avec la sortie donnée par le thread1.So finalement, quand le premier thread sera tué, le second sera lancé mais ne donnera une sortie que s'il y a une entrée pour ce thread.Comment supprimer un thread d'un autre thread dans Java?

Répondre

13

Java a des méthodes obsolètes pour tuer explicitement un autre thread (comme Thread.stop/Thread.destroy). La bonne façon est de s'assurer que les opérations sur l'autre thread puissent être stoppées (par exemple, elles attendent une exception InterruptedException, ce qui signifie que vous pouvez appeler Thread.interrupt() pour l'arrêter).

Vous pouvez également être intéressé par la définition du deuxième thread en tant que daemon thread, ce qui signifie que dans le cas où tous les autres threads de la VM ont terminé, le processus se termine.

2

Selon these instructions, il est préférable d'utiliser des variables de drapeau pour dire à l'autre thread d'arrêter son travail proprement.

+0

Merci beaucoup pour la suggestion mais aidez-moi à le spécifier correctement. – Raji

6

Voir this Java Specialist article pour savoir comment arrêter les threads proprement.

En bref, l'article recommande Thread.interrupt() plus la manipulation appropriée InterruptedException dans le code de thread. C'est une discussion intéressante en soi, et quelque chose que je vois rarement fait correctement.

+1

Cet article est une excellente lecture et recommandé à tous ceux qui n'ont pas assez de temps pour lire la programmation simultanée de Doug Lea en Java – abyx

1

Dans la méthode run() de votre thread, vérifiez un attribut défini via une méthode d'accès comme shutdown() lorsque vous souhaitez arrêter le thread, utilisez cette valeur pour terminer la boucle while. Par exemple:

boolean stopping = false; 

Thread currentThread = null; 

public void run() { 

    currentThread = Thread.currentThread(); 

    while (!isStopping()) { 

     // do something, sleep a while 
    } 
} 

public synchronized void shutdown() { 

    stopping = true; 

    currentThread.notifyAll(); 
} 

public synchronized boolean isStopping() { 

    return stopping; 
} 
+0

Votre code a une condition de concurrence et votre utilisation de la synchronisation est faible. C'est beaucoup mieux de simplement vérifier l'état interrompu du thread actuel ou si vous devez utiliser une sorte de sentinelle, au moins le rendre atomique. – Kevin

+0

@Kevin, vous devez avoir manqué le bit * Par exemple *, ce code est évidemment destiné à montrer la structure d'une solution - à ne pas utiliser tel quel. – rsp

+1

@rsp: Si vous publiez des exemples, préférez-en de bons exemples. Si les gens savaient déjà distinguer les bons des mauvais exemples, ils n'auraient pas à demander ici. –

Questions connexes