Introducción de CountDownLatch del componente de sincronización de trama JUC-AQS

¿Qué es CountDownLatch?

CountDownLatchSe introdujo en java 1.5 , y las clases de utilidad concurrentes introducidas con él también tienen ,, CyclicBarriery Semaphore, ConcurrentHashMapy BlockingQueuetodas existen bajo el paquete java.util.concurrent. La clase CountDownLatch permite que un hilo espere a que otros hilos completen su trabajo antes de ejecutarse. Por ejemplo, el subproceso principal de la aplicación desea ejecutarse después de que el subproceso responsable de iniciar el servicio de marco ha iniciado todos los servicios de marco.
CountDownLatch se implementa por uno 计数器, el valor inicial del contador es el número de subprocesos. Cada vez que un hilo completa su tarea, el valor del contador disminuirá en uno. Cuando el valor del contador alcanza 0, indica que todos los hilos han completado la tarea, y luego el hilo que espera en el bloqueo puede reanudar la ejecución de la tarea.

El punto central de CountDownLatch es: "aguardará bloques inmediatamente y se levantará la cuenta regresiva.

En cuanto a countDownLatch.await (10, TimeUnit.MILLISECONDS) 可选时间参数, existe una condición de cancelación de bloqueo adicional, cuando el recuento llega a 0 y el tiempo llega a 0, se cumple una de las condiciones y se puede liberar el hilo de bloqueo en espera.

Puedes ejecutar esta pequeña demostración,
package com.bestksl.example.aqs;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.*;

@Slf4j
public class CountDownLatchExample2 {

    static final int clientTotal = 500;  //并发总计数
    static final int threadTotal = 20;   //并发线程最大值


    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
        Semaphore semaphore = new Semaphore(threadTotal);
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < clientTotal; i++) {
            final int n = i;
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    p(n);
                    semaphore.release();
                } catch (InterruptedException e) {
                    log.info(e.getMessage());
                } finally {
                    countDownLatch.countDown();  // 因为只是示范, 所以放到了finally中保证计数, 如有特殊情况应该加入处理逻辑
                }
            });
        }

        executorService.execute(() -> {
            try {
                countDownLatch.await(10, TimeUnit.MILLISECONDS);// 加上时间参数可以强行到时激活await()
                System.out.println("done");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        executorService.shutdown();
    }

    //并发方法
    private static void p(int n) throws InterruptedException {
        Thread.sleep(200);
        log.info(n + "");
        Thread.sleep(200);
    }
}
Publicado 248 artículos originales · elogiado 416 · 90,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/qq_33709508/article/details/105463912
Recomendado
Clasificación