AQS의 여러 동기화 구성 요소

AQS의 여러 동기화 구성 요소

CountDownLatch를

스레드 이상의 스레드 실행 다른 작업 스레드가 실행을 계속하기 전에 완료 할 때까지 기다립니다.

응용 프로그램 : 병렬 컴퓨팅.

카운터 무게는 카운트 값은 한 번만, 유사한 작업을 추가 할 수 없습니다.

첫째, 호출 새로운 CountDownLatch를 사용 카운트에 생성자 다음은 스레드를 기다리고, 스레드가 메소드는 블록을 기다리고, 아래 0으로 될 때까지 다른 스레드의 수를 줄이기 위해 카운트 다운 방식으로 호출 대기 상태가됩니다 스레드는 원활한 이행을 보장하기 위해, 카운트 다운 방법은 보장 finally 블록에 배치해야합니다, 작업을 계속 깨우지됩니다.

AWAIT 방법은 또한 타임 아웃을 설정할 수 CountDownLatch를, 첫 번째 파라미터는 초 단위 이상 해당 AWAIT 스레드보다 완전한 실행 계속 주어진 스레드 전에 깨우한다 숫자이다.

세마포어 (세마포어)

제어 얼마나 많은 스레드가 될 수있는 리소스에 액세스하는 방법

시나리오 : 같은 데이터베이스 연결과 같은 제한된 자원과 동시성 제어 할 수 있습니다.

우선, 새로운 사용 semaphere 후 파라미터 (20) 등의 동시 액세스의 개수 일 수있다.

그러면 스레드 획득의 메소드를 호출하고, 두 부분 사이에 동시의 동작 부분을 제어하는 ​​방법을 분리 한 다음 완료되므로 때 스레드 실행 (20)의 최대 동시 액세스 장면 데이터베이스 동시성 제어되도록 연결되었을 때, 당신은 연결이 예외가 발생하지 않습니다.

획득 및 해제 방법 또는 방법은 수신 방법에 파라미터로서 면허 번호 동시에 얻어지는 여러 라이선스를 해제 할 수있다.

또한 직접 인증 안 관련된 경쟁 스레드가 포기하는 경우이 작업을 수행 할 수있는 라이센스를 취득하는 경우, 당신은, if 문으로 된 tryAcquire 방법을 넣을 수 있습니다, 당신은 포기 할 수 없거나 해당 작업을 수행 할 수,이 시나리오를 수행 할 수 있습니다.

된 tryAcquire의 방법은, 당신은 또한 더 인수는 얼마 동안 기다릴 없거나 다음 경우에하는 것이 false를 반환 할 수 있음을 나타냅니다 시간 매개 변수를 전달할 수 이상의 면허를 취득하려고합니다.

으로 CyclicBarrier

모든 준비가 스레드가 각 스레드 뒤에 다음과 같은 작업을 수행 할 수있을 때 여러 스레드가 서로 대기 구현할 수 있습니다.

시나리오 : 멀티 스레드 컴퓨팅

그것은 차이를 CountDownLatch를 : 그것은 재활용 할 수 있습니다, 그것은 여러 스레드가 서로를 기다릴 것입니다.

호출 스레드를 기다리는 경우, 카운터 값은 카운터 값이 추가로 대응 될 때까지 1 씩 증가하고, 모든 스레드의 방출 및 카운터는 다시 0으로, 재사용 될 수있다.

우선, 새로운으로 CyclicBarrier 파라미터 전달 마크의 값은 분리가 나타낸다. 각 스레드가 폐쇄 실행 방법을 기다리는 호출 일단 원하는 값이 모든 스레드 차단을 해제 할 때까지 표시가 추가 될 기다리는 호출 함께 수행 하였다. 으로 CyclicBarrier 생성자가 작업 실행 플래그 값의 우선도에 도달 할 때, 그리고 다른 스레드의 실행 후에 방출되고, 추가의 Runnable있다.

방법은이 시간이 자동으로 현재 스레드를 깨워 것입니다 후, 시간 매개 변수를 설정할 수 있지만 구현 처리 방법에 BrokenBarrierException를 throw 할 수 기다리고 있습니다, 예외 캐치를하고 우리가 자동 알람을 달성 할 수 있도록 한 후, 사는 것을 계속한다.

두 개의 교환 가치에 스레드와 들어 계속 실행.

일반적인하는 새로운 교환기 객체를 생성, 제네릭 형식 교환 할 값의 유형입니다. 스레드 1은 다음의 방법은 1 통과의 교환 가치를 교환 호출 다음 스레드 1 2 스위칭 대기 차단 상태로 스레드. 스레드 1 스레드 2는 1 개의 스레드가 계속 실행 값을 가지고있는 동안 스레드 2는 교환 가치 방법은 전달 (2)를 교환 호출,이 값을 얻는다.

교환 방법은 실 (2)를 직접 교환 불가 반환되는 경우 일정 시간 동안 대기하는 의미 그것에 타임 시간 + 유닛을 통과 할 수있다.

포크 / 가입 프레임 워크

이 프레임 워크는 병렬 계산 작은 집합체의 문제점을 해결하기 위해 문제의 일종이다. 해당 태스크 실행 큐를 실행 한 스레드가 스레드의 타단으로부터 큐를 취할 경우, 각 스레드에 대한 큐 할당 작업 도난 알고리즘을 사용하여, 큐의 선두로부터 각각의 스레드 만 실행, 그들의 작업을 수행하고 큐 태스크를 유일하게 가능한 경쟁을 갖는 경우, 알고리즘은 멀티 스레드 병렬 계산의 장점을 최대한 활용하게하고, 스레드 간의 경쟁을 줄인다. 몇 가지 제한이이 프레임 워크를 사용합니다 :

1 만 포크를 사용할 수 있습니다 / 그렇지 않으면 스레드 메커니즘을 파괴, 스레드를 제어하기 위해 가입

이 작업이 IO 작업을 수행 할 수 없습니다

3, 작업은 예외를 던질 수 없습니다

ForkJoinPool 오브젝트를 사용하는 경우 우선, 다음 리턴 값의 연산 결과 인 컴퓨팅 클래스 RecursiveTask 인터페이스 대체 계산 방법의 구성을 구현하고 새로운 개체, 개체가 미래 목표를 획득하기 위해 풀 제출, 다음 미래는 호출 결과를 얻을 얻을 수있을 것입니다. 계산 방법, 작은 문제에 큰 문제에 대한 생각, 결과는 수익을 지시합니다 작은 문제, 객체에 새 큰 문제를 직접 질문에 응용 프로그램을 계산 한 다음 객체는 포크 계산 방법은 가입 방법으로 시작 호출 결과를 얻을 결과가 반환 요약 한 것입니다.

클래스를 설정 ForkJoinTask1하는 RecursiveTask 인터페이스 다시 쓰기 연산 방법을 상속,이 방법의 논리는 정제 문제에 큰 문제는, ForkJoinTask1 작은 문제를 설정하는 경우, 다음 포크를 호출하고 작은 문제의 결과를 얻을 수있는 방법을 결합이다, 마지막으로 큰 문제를 가지고 값. 그것은 작은 문제의 경우 직접 분할을 계산 할 필요가 없습니다.

public class ForkJoinTask1 extends RecursiveTask<Integer>{

    public static final int num = 2;
    private int start;
    private int end;

    public ForkJoinTask1(int start, int end) {
        this.start = start;
        this.end = end;
    }
    
    @Override
    protected Integer compute() {
        // TODO Auto-generated method stub
        int sum = 0;
        boolean canCompute = (end - start) <= num;
        if(canCompute) {
            for(int i = start; i <= end; i++) {
                sum += i;
            }
        }else {
            int middle = (start + end) / 2;
            ForkJoinTask1 leftTask = new ForkJoinTask1(start, middle);
            ForkJoinTask1 rightTask = new ForkJoinTask1(middle + 1, end);
            
            //执行子任务
            leftTask.fork();
            rightTask.fork();
            
            //等待任务执行结束合并其结果
            int leftResult = leftTask.join();
            int rightResult = rightTask.join();
            
            sum = leftResult + rightResult;
        }
        return sum;
    }
}

첫째, 때 ForkJoinPool 객체를 호출 한 다음 ForkJoinTask1은, 미래를 얻을 수있는 풀의 작업 개체에 제출 될 작업 클래스를 생성, 결과를 얻을 수.

        ForkJoinPool pool = new ForkJoinPool();
        
        ForkJoinTask1 task = new ForkJoinTask1(1, 100);
        
        Future<Integer> result = pool.submit(task);
        
        System.out.println(result.get());

추천

출처www.cnblogs.com/shizhuoping/p/11547272.html