자바 다 중 스 레 드 빨리 해결 해 줄 게(5)
Countdown Lantch 카운트다운,동기 화 보조 클래스,하나의 스 레 드(또는 여러 개),다른 N 개의 스 레 드 가 어떤 일 을 완성 한 후에 야 실행 할 수 있 습 니 다.주어진 개수 로 Countdown Latch 를 초기 화 합 니 다.실 행 된 스 레 드 개 수 를 기다 리 겠 다 는 뜻 입 니 다.
Countdown()을 호출 할 때마다 1 을 줄 이 고 await()함수 가 0 이 될 때 까지 기다 리 는 스 레 드 의 실행 을 막 습 니 다.
CountDownlatch 리 셋 불가
2.countdownlantch 의 용법.
예 를 들다
장면:10 인 달리기 시 뮬 레이 션."Game Start"를 외치 고 나 서 야 뛰 기 시 작 했 습 니 다.10 명 이 뛰 고 나 서 야"Game Over."라 고 외 쳤 습 니 다.코드 는 다음 과 같 습 니 다.
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* CountDownLatchTest
* @author
*/
public class CountDownLatchTest {
private static final int RUNNER_COUNT = 10;
private static final int CORE_THREAD_COUNT = 10;
public static void main(String[] args) throws InterruptedException {
final CountDownLatch begin = new CountDownLatch(1);
final CountDownLatch end = new CountDownLatch(RUNNER_COUNT);
final ExecutorService exec = Executors.newFixedThreadPool(CORE_THREAD_COUNT);
//
for (int i = 0; i < RUNNER_COUNT; i++) {
final int NO = i + 1;
Runnable run = () -> {
try {
// begin
begin.await();
Thread.sleep((long)(Math.random() * 10000));
System.out.println("No." + NO + " arrived");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//
end.countDown();
}
};
exec.submit(run);
}
System.out.println("Game Start ...");
begin.countDown();
//
end.await();
System.out.println("Game Over.");
exec.shutdown();
}
}
3.AQS 를 어떻게 이용 하여 CountDownlatch 를 실현 합 니까?
private static final class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 4982264981922014374L;
Sync(int count) {
setState(count);
}
int getCount() {
return getState();
}
protected int tryAcquireShared(int acquires) {
return (getState() == 0) ? 1 : -1;
}
protected boolean tryReleaseShared(int releases) {
// Decrement count; signal when transition to zero
for (;;) {
int c = getState();
if (c == 0)
return false;
int nextc = c-1;
if (compareAndSetState(c, nextc))
return nextc == 0;
}
}
}
전체 Sync 의 코드 구현 은 간단 합 니 다.4.567917.스 레 드 계 수 는 state 통 제 를 통 해 지난 글 에서 우리 가 분석 한 바 와 같이 state 의 동기 화 사용 CAS 가 실현 하 는 낙관적 인 자물쇠 이다
AQS 의 실현 은 다음 글 을 볼 수 있다.'다 중 스 레 드 시리즈 5>아무 도 말 하지 않 은 AQS,다 중 스 레 드 프로 그래 밍 을 연결 합 니 다.
4.총화
countdownlantch 의 단독 코드 를 분석 해 보면 AQS 를 통 해 이 루어 진 스 레 드 동기 화가 얼마나 간단 한 지 알 수 있 기 때문에 AQS 를 이해 하면 자신의 동기 화 기 를 실현 할 수 있 습 니 다.
이 글 은 여기까지 입 니 다.당신 에 게 도움 이 되 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.