Java Language CountDownLatch


Exemple

CountDownLatch

Une aide à la synchronisation qui permet à un ou plusieurs threads d'attendre qu'un ensemble d'opérations soit exécuté dans d'autres threads.

  1. Un CountDownLatch est initialisé avec un nombre donné.
  2. Les méthodes d’attente bloquent jusqu’à ce que le nombre actuel atteigne zéro en raison des countDown() méthode countDown() , après quoi tous les threads en attente sont libérés et toutes les invocations d’attente suivantes sont countDown() immédiatement.
  3. Il s’agit d’un phénomène ponctuel: le compte ne peut pas être réinitialisé. Si vous avez besoin d'une version qui réinitialise le compte, envisagez d'utiliser un CyclicBarrier .

Méthodes clés:

public void await() throws InterruptedException

Fait en sorte que le thread en cours attende que le verrou ait été ramené à zéro, à moins que le thread ne soit interrompu.

public void countDown()

Diminue le nombre de verrous, libérant tous les threads en attente si le nombre atteint zéro.

Exemple:

import java.util.concurrent.*;

class DoSomethingInAThread implements Runnable {
    CountDownLatch latch;
    public DoSomethingInAThread(CountDownLatch latch) {
        this.latch = latch;
    } 
    public void run() {
        try {
            System.out.println("Do some thing");
            latch.countDown();
        } catch(Exception err) {
            err.printStackTrace();
        }
    }
}

public class CountDownLatchDemo {
    public static void main(String[] args) {
        try {
            int numberOfThreads = 5;
            if (args.length < 1) {
                System.out.println("Usage: java CountDownLatchDemo numberOfThreads");
                return;
            }
            try {
                numberOfThreads = Integer.parseInt(args[0]);
            } catch(NumberFormatException ne) {
            
            }
            CountDownLatch latch = new CountDownLatch(numberOfThreads);
            for (int n = 0; n < numberOfThreads; n++) {
                Thread t = new Thread(new DoSomethingInAThread(latch));
                t.start();
            }
            latch.await();
            System.out.println("In Main thread after completion of " + numberOfThreads + " threads");
        } catch(Exception err) {
            err.printStackTrace();
        }
    }
}

sortie:

java CountDownLatchDemo 5
Do some thing
Do some thing
Do some thing
Do some thing
Do some thing
In Main thread after completion of 5 threads

Explication:

  1. CountDownLatch est initialisé avec un compteur de 5 dans le thread principal
  2. Le thread principal attend en utilisant la méthode await() .
  3. Cinq instances de DoSomethingInAThread ont été créées. Chaque instance décrémente le compteur avec la méthode countDown() .
  4. Une fois que le compteur devient nul, le thread principal reprendra