>  기사  >  Java  >  Java에서 높은 동시성을 위해 CyclicBarrier를 사용하는 방법

Java에서 높은 동시성을 위해 CyclicBarrier를 사용하는 방법

PHPz
PHPz앞으로
2023-04-14 19:07:081098검색

Java의 CyclicBarrier는 실행을 계속하기 전에 모든 스레드가 장벽에 도달할 때까지 여러 스레드가 장벽에서 대기할 수 있도록 하는 동기화 도구입니다. CyclicBarrier는 특정 지점에서 동시에 실행될 수 있도록 여러 스레드의 실행을 조정하는 데 사용할 수 있습니다.

CyclicBarrier는 여러 스레드가 실행을 계속하기 전에 모든 스레드가 해당 지점에 도달할 때까지 여러 스레드가 장벽 지점에서 기다릴 수 있도록 하는 Java의 동기화 도구입니다. CyclicBarrier는 특정 지점에서 동시에 실행될 수 있도록 여러 스레드의 실행을 조정하는 데 사용할 수 있습니다.

Usage

CyclicBarrier의 기본 사용법은 다음과 같습니다.

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {

    public static void main(String[] args) {
        int n = 3;
        CyclicBarrier barrier = new CyclicBarrier(n, new Runnable() {
            public void run() {
                System.out.println("All threads have reached the barrier");
            }
        });

        Thread t1 = new Thread(new MyRunnable(barrier), "Thread 1");
        Thread t2 = new Thread(new MyRunnable(barrier), "Thread 2");
        Thread t3 = new Thread(new MyRunnable(barrier), "Thread 3");

        t1.start();
        t2.start();
        t3.start();
    }

    static class MyRunnable implements Runnable {
        private final CyclicBarrier barrier;

        public MyRunnable(CyclicBarrier barrier) {
            this.barrier = barrier;
        }

        public void run() {
            try {
                System.out.println(Thread.currentThread().getName() + " is waiting at the barrier...");
                barrier.await();
                System.out.println(Thread.currentThread().getName() + " has crossed the barrier");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

이 예에서는 3개의 스레드가 장벽 지점에 도달할 때까지 기다려야 하는 CyclicBarrier 개체를 만듭니다. 모든 스레드가 장벽 지점에 도달하면 콜백 함수가 트리거되고 메시지가 인쇄됩니다.

3개의 스레드를 생성하여 사용자 정의 Runnable 개체에 전달합니다. 각 스레드의 run 메소드에서 먼저 스레드가 장벽 지점을 기다리고 있음을 나타내는 메시지를 인쇄합니다. 그런 다음 Barrier.await() 메서드를 호출하여 스레드를 대기 중인 대기열에 추가합니다. 모든 스레드가 장벽 지점에 도달할 때까지 실행이 계속되지 않습니다. 마지막에는 스레드가 장벽 지점을 통과했음을 나타내는 메시지를 인쇄합니다.

위 코드의 실행 결과는 다음과 같습니다.

스레드 1이 장벽에서 기다리고 있습니다...
스레드 3이 장벽에서 기다리고 있습니다...
스레드 2가 장벽에서 기다리고 있습니다...
모두 스레드가 장벽에 도달했습니다
스레드 2가 장벽을 통과했습니다
스레드 1이 장벽을 통과했습니다
스레드 3이 장벽을 통과했습니다

위 코드에서 볼 수 있듯이 CyclicBarrier는 다음과 같은 경우에 사용되는 선택적 콜백 함수도 지원합니다. 모든 스레드 도착 장벽 지점에 도달한 후 지정된 콜백 함수가 호출됩니다. 위의 예에서 모든 스레드가 장벽 지점에 도달하면 콜백 함수가 실행되어 장벽 지점에 도달했음을 나타냅니다.

CyclicBarrier는 스레드가 장벽 지점에 도달할 때까지 기다리는 동안 몇 가지 추가 작업을 수행하는 고급 사용법도 지원합니다. 이는 아래와 같이 Wait 메서드의 반환 값을 통해 달성할 수 있습니다.

int index = barrier.await();
if (index == 0) {
    // 执行额外的操作
}

이 예에서 Wait 메서드의 반환 값은 대기 대기열에 있는 스레드의 위치를 ​​나타냅니다. 반환 값이 0인 경우입니다. 현재 스레드가 마지막 스레드라는 의미입니다. 장벽 지점에 도달한 스레드는 데이터 정리와 같은 일부 마무리 작업을 수행하는 등 몇 가지 추가 작업을 수행할 수 있습니다.

Notes

Java에서 CyclicBarrier를 사용할 때 다음 사항에 주의해야 합니다.

1 CyclicBarrier의 카운터는 재사용 가능합니다. 즉, 모든 스레드가 장벽 지점에 도달하면 카운터가 재설정됩니다. 초기값이며 다시 사용할 수 있습니다. 대기 중에 예외가 발생하면 카운터가 재설정되고 모든 대기 스레드에서 BrokenBarrierException이 발생합니다.

2. CyclicBarrier를 사용할 때 대기 스레드 수가 카운터의 초기 값을 초과하면 모든 스레드가 영원히 대기합니다. 따라서 CyclicBarrier를 사용할 때는 대기 스레드 수가 카운터의 초기 값을 초과하지 않는지 확인해야 합니다.

3. CyclicBarrier의 콜백 함수는 마지막 스레드가 장벽 지점에 도달하면 실행됩니다. 따라서 콜백 함수에서 수행되는 작업은 스레드로부터 안전해야 합니다. 그렇지 않으면 예측할 수 없는 결과가 발생할 수 있습니다.

4. CyclicBarrier는 특정 지점에서 동시에 실행될 수 있도록 여러 스레드의 실행을 조정하는 데 사용할 수 있습니다. **그러나 스레드 간의 실행 순서가 프로그램의 정확성에 중요한 경우 CyclicBarrier가 최선의 선택이 아닐 수 있습니다. **이 경우 CountDownLatch 또는 Semaphore와 같은 다른 동기화 도구를 사용해야 할 수도 있습니다.

5. CyclicBarrier의 성능은 대기 스레드 수와 카운터의 초기 값에 영향을 받을 수 있습니다. **대기 스레드 수가 많거나, 카운터 초기값이 큰 경우 성능 저하가 발생할 수 있습니다. **따라서 CyclicBarrier 사용 시 실제 상황에 맞게 조정이 필요합니다.

간단히 말하면 Java에서 CyclicBarrier를 사용할 때는 프로그램의 정확성과 성능을 보장하기 위해 다양한 상황을 신중하게 고려해야 합니다.

위 내용은 Java에서 높은 동시성을 위해 CyclicBarrier를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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