a commencé plusieurs threads travailleurs, doivent les informer pour arrêter. Étant donné que certains des threads dormiront pendant un moment avant le prochain cycle de travail, ont besoin d'une manière qui peut les notifier même quand ils dorment.
Si c'était la programmation Windows, je pourrais utiliser des fonctions d'événement et d'attente. En Java, je fais cela en utilisant un objet de compte à rebours qui comporte 1. Cela fonctionne mais ne vous sentez pas élégant, surtout à vérifier la valeur de comptage pour voir si nécessaire: P>
run(){
while(countDownLatch.count()>0){
//working
// ...
countDownLatch.wait(60,TimeUnit.SECONDS);
}
}
5 Réponses :
Utilisez le cadre d'interruption de threads intégré. Pour arrêter un appel de travailleur, appeler dans le thread de travailleur: p> OdewederThread.Interrupt () Code> Cela entraînera certaines méthodes (comme threadsleep ()) pour lancer une exception interrompue. Si vos threads n'appellent pas des méthodes interruptables, vous devez vérifier l'état interrompu.
Good Way consiste à garder à l'esprit les deux cas quand on interrompt: p> < ul>
Interruption () Code> Les fils et le fil à l'intérieur font du cycle comme SALLEZ CODE> ou ATTENTE CODE> ALORS InterrupteException code> sera lancé; li>
La meilleure approche consiste à interruption () code> thread thread thread.
et aussi longtemps que vous avez une référence à t Code>, tout ce qui est nécessaire pour "arrêter" t code> est d'invoquer t.interrupt () code>. p> p>
J'aime le fait que vous avez mentionné pour interrompre à nouveau car le drapeau interrompu est effacé.
L'autre meilleure approche serait d'utiliser interruption () code> méthode.
E.g Voici comment un thread utilise ces informations pour déterminer s'il doit se terminer ou non: P>
public class TestAgain extends Thread {
// ...
// ...
public void run( ) {
while (!isInterrupted( )) {
// ...
}
}
}
Avoir un pool de fils, j'utiliserais le ExecuTertorservice ou un SchedulgueDExecutservice pour des tâches retardées / périodiques. Lorsque vous voulez que les travailleurs s'arrêtent, vous pouvez utiliser P> executorService.shutdown();
Il devait utiliser shutdownow () cependant.
Ce n'est pas tout à fait la réponse que vous recherchez, mais vous devriez utiliser les piscines de fil (java.util.concurrent). Je suis presque sûr qu'ils peuvent faire ce que vous voulez et ils sont libres de bugs et vous pouvez utiliser votre temps pour développer d'autres choses.
Voulez-vous arrêter tous les threads ou vous voulez seulement arrêter quelques-uns?
@ Mooonbeam J'ai besoin de les arrêter individuellement, alors la piscine de fil ne semble pas être une solution réalisable.
@HourSearmor, puis une majorité, sinon toutes les réponses données conviennent.