9
votes

Un meilleur moyen de signaler un autre fil d'arrêt?

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);
    }
}


4 commentaires

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.


5 Réponses :


0
votes

Utilisez le cadre d'interruption de threads intégré. Pour arrêter un appel de travailleur, appeler OdewederThread.Interrupt () 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.

dans le thread de travailleur: xxx


0 commentaires

0
votes

Good Way consiste à Interruption () Les fils et le fil à l'intérieur font du cycle comme xxx

garder à l'esprit les deux cas quand on interrompt: < ul>

  • Si vous SALLEZ ou ATTENTE ALORS InterrupteException sera lancé;
  • Dans d'autres cas, le drapeau interrompu sera défini pour le fil que vous devez vérifier vous-même.

  • 0 commentaires

    9
    votes

    La meilleure approche consiste à interruption () thread thread thread.


    xxx

    et aussi longtemps que vous avez une référence à t , tout ce qui est nécessaire pour "arrêter" t est d'invoquer t.interrupt () .


    1 commentaires

    J'aime le fait que vous avez mentionné pour interrompre à nouveau car le drapeau interrompu est effacé.



    0
    votes

    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( )) {
                      //    ...
                         }
                     }     
               }
    


    0 commentaires