La serie JUC de entrevistas en Java: CountDownLatch

CountDownLatch

concepto

Deje que algunos subprocesos se bloqueen hasta que otros completen una serie de operaciones antes de ser despertados

CountDownLatch tiene principalmente dos métodos: cuando uno o más subprocesos llaman al método await, el subproceso que realiza la llamada se bloqueará. Cuando otros subprocesos llaman al método CountDown, el contador disminuirá en 1 (el subproceso que llama al método CountDown no se bloqueará). Cuando el valor del contador sea cero, el subproceso bloqueado al llamar al método await se despertará y continuará. ejecución

Escenas

Ahora hay una escena así, supongamos que hay 7 personas en una sala de estudio, una de ellas es el monitor. La principal responsabilidad del monitor es apagar las luces, cerrar la puerta del aula y luego irse después de los otros 6 estudiantes. se han ido. Por lo tanto, el monitor debe irse. El último en irse, por lo que hay alguna forma de controlar el monitor de que este hilo es el último en ejecutarse, mientras que otros hilos se ejecutan aleatoriamente

solución

En este momento, se utiliza CountDownLatch, el contador. Creamos un total de 6 hilos, y luego el valor del contador también se establece en 6

// 计数器
CountDownLatch countDownLatch = new CountDownLatch(6);

Luego, cada vez que se ejecuta el hilo del estudiante, el valor del contador se reduce en 1

for (int i = 0; i <= 6; i++) {
    
    
    new Thread(() -> {
    
    
        System.out.println(Thread.currentThread().getName() + "\t 上完自习,离开教室");
        countDownLatch.countDown();
    }, String.valueOf(i)).start();
}

Finalmente, necesitamos controlar la ejecución del hilo principal del líder de escuadrón a través del método de espera de CountDownLatch. Aquí countDownLatch.await () se puede considerar como una pared. Solo cuando el valor del contador es 0, la pared desaparecen y el hilo principal puede seguir bajando.

countDownLatch.await();

System.out.println(Thread.currentThread().getName() + "\t 班长最后关门");

Sin el resultado de ejecución de CountDownLatch, encontramos que el hilo principal se ha ejecutado antes de tiempo

1	 上完自习,离开教室
0	 上完自习,离开教室
main	 班长最后关门
2	 上完自习,离开教室
3	 上完自习,离开教室
4	 上完自习,离开教室
5	 上完自习,离开教室
6	 上完自习,离开教室

Después de introducir el resultado de ejecución de CountDownLatch, podemos controlar la ejecución del método principal, para asegurar la ejecución de las tareas prerrequisito.

0	 上完自习,离开教室
2	 上完自习,离开教室
4	 上完自习,离开教室
1	 上完自习,离开教室
5	 上完自习,离开教室
6	 上完自习,离开教室
3	 上完自习,离开教室
main	 班长最后关门

Código completo

package com.moxi.interview.study.thread;

import java.util.concurrent.CountDownLatch;

/**

 */
public class CountDownLatchDemo {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    

        // 计数器
        CountDownLatch countDownLatch = new CountDownLatch(6);

        for (int i = 0; i <= 6; i++) {
    
    
            new Thread(() -> {
    
    
                System.out.println(Thread.currentThread().getName() + "\t 上完自习,离开教室");
                countDownLatch.countDown();
            }, String.valueOf(i)).start();
        }

        countDownLatch.await();

        System.out.println(Thread.currentThread().getName() + "\t 班长最后关门");
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43314519/article/details/110196198
Recomendado
Clasificación