>  기사  >  Java  >  Java CountDownLatch 카운터 및 CyclicBarrier 사이클 장벽을 정의하는 방법

Java CountDownLatch 카운터 및 CyclicBarrier 사이클 장벽을 정의하는 방법

WBOY
WBOY앞으로
2023-05-21 18:25:14712검색

Definition

CountDownLatch: 하나 이상의 스레드가 다른 스레드에서 수행 중인 일련의 작업이 완료될 때까지 기다릴 수 있도록 하는 동기화 보조 장치입니다.

CyclicBarrier: 스레드 집합이 모두 각 작업을 기다리도록 하는 동기화 보조 장치입니다.

위는 Oracle의 공식 정의입니다. 간단히 말해서

CountDownLatch: 하나 이상의 스레드가 다른 스레드에서 수행된 일련의 작업이 완료될 때까지 기다릴 수 있도록 하는 카운터입니다.

CyclicBarrier: 순환 장벽을 사용하면 스레드 그룹이 서로 공통 장벽 지점에 도달할 때까지 기다릴 수 있습니다.

Difference

  • CountDownLatch는 AQS(AbstractQueuedSynchronizer)의 구성원이지만 CyclicBarrier는 그렇지 않습니다.

  • CountDownLatch의 사용 시나리오에는 두 가지 유형의 스레드가 있습니다. 하나는 wait() 메서드를 호출하는 대기 스레드이고 다른 하나는 countDownl() 메서드를 호출하는 작동 스레드입니다. CyclicBarrier의 맥락에서 모든 스레드는 서로를 기다리는 스레드이며 동일한 유형입니다.

  • CountDownLatch는 감소 후 재설정할 수 없는 다운 카운트입니다. CyclicBarrier는 증가 후 자동으로 재설정되는 업 카운트입니다.

CountDownLatch 예

두 개의 스레드 그룹을 생성하고 한 그룹은 다른 그룹을 기다립니다. 계속하기 전에 그룹 실행을 완료하세요

CountDownLatch countDownLatch = new CountDownLatch(5);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
    executorService.execute(() -> {
        countDownLatch.countDown();
        System.out.println("run..");
    });
}
for (int i = 0; i < 3; i++) {  //我们要等上面执行完成才继续
    executorService.execute(() -> {
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("await..");
    });
}
executorService.shutdown();

Print:

run..
run..
run..
run..
run..
await..
await..
await..

Wait for 누적 스레드가 실행을 마친 후 메인 스레드가 누적 결과를 출력합니다

public class ThreadUnsafeExample {
    private int cnt = 0;
    public void add() {
        cnt++;
    }
    public int get() {
        return cnt;
    }
    public static void main(String[] args) throws InterruptedException {
        final int threadSize = 1000;
        ThreadUnsafeExample example = new ThreadUnsafeExample();
        final CountDownLatch countDownLatch = new CountDownLatch(threadSize);
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < threadSize; i++) {
            executorService.execute(() -> {
                example.add();
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        System.out.println(example.get());
    }
}

Print:

997

3 동시성 시뮬레이션

ExecutorService executorService = Executors.newCachedThreadPool();
        CountDownLatch countDownLatch = new CountDownLatch(1);
        for (int i = 0; i < 5; i++) {
            executorService.submit( () -> {
                try {
                    countDownLatch.await();
                    System.out.println("【" + Thread.currentThread().getName() + "】开始执行……");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        Thread.sleep(2000);
        countDownLatch.countDown();//开始并发
        executorService.shutdown();

Print:

【pool-2-thread-2】실행 시작&hellip ;…
【pool-2-thread-5 】실행 시작...
【pool-2-thread-3】실행 시작...
【pool-2-thread-1】실행 시작... 실행. ..

CyclicBarrier 예제

모든 스레드는 실행을 계속하기 전에 특정 단계가 완료될 때까지 서로를 기다립니다.

        final int totalThread = 3;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < totalThread; i++) {
            executorService.execute(() -> {
                System.out.println("before..");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("after..");
            });
        }
        executorService.shutdown();

Print:

before..

before..
before..
after..
after . .
이후..

위 내용은 Java CountDownLatch 카운터 및 CyclicBarrier 사이클 장벽을 정의하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제