비동기 프로그래밍 -countDownLatch를 사용하여 비동기 멀티스레드 결과를 동기화하여 반환
CountDownLatch 클래스는java에 있습니다.util.concurrent 패키지에서 그것을 이용하여 유사한 계수기의 기능을 실현할 수 있습니다.예를 들어 하나의 작업 A는 다른 네 개의 작업이 끝난 후에야 실행할 수 있는데, 이때 CountDownLatch를 이용하여 이러한 기능을 실현할 수 있다.
CountDownLatch 클래스는 하나의 구조자만 제공합니다.
public CountDownLatch(int count) { }; // count
다음 3가지 방법은 CountDownLatch 클래스에서 가장 중요한 방법입니다.
public void await() throws InterruptedException { }; // await() , count 0
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; // await() , count 0
public void countDown() { }; // count 1
countDownLatch를 사용하여 비동기식 멀티스레드 결과를 동기화하여 반환
만약에 프로젝트 수행 과정에서 여러 개의 독립된 모듈이 비동기적으로 집행된다면 집행 결과를 통일적으로 처리한 후에 되돌아온다. 코드는 각 모듈을 순서대로 호출하여 집행한 다음에 통일적으로 처리할 수 있지만 효율이 너무 낮다. 다중 스레드 비동기 처리를 고려하지만 비동기적으로 제출 임무를 집행한 후에 다른 코드를 순서대로 집행하면 각 모듈의 처리 결과를 통일적으로 얻을 수 없다.countDownLatch를 사용하면 모든 비동기 스레드가 실행될 때까지 기다렸다가 통일적으로 처리할 수 있습니다.
countDownLatch 구현 원리
private final Sync sync;
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
초기화할 때 동기화 컨트롤러 Sync에 작업 개수를 전달하고,countDown 메소드를 호출할 때마다 비동기 작업을 시작하고, Sync는 자원을 방출합니다.
public void countDown() {
sync.releaseShared(1);
}
await를 호출합니다. await 방법은 Sycn의 상태를 판단합니다. 만약 Sync 상태가 실행이 완료되지 않았다고 표시된다면 자원 실행을 계속 분배합니다.countDown이 0이면 비동기식 결과가 일괄적으로 반환됩니다.
코드 예
public class Test {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2);
new Thread(){
public void run() {
try {
System.out.println(" "+Thread.currentThread().getName()+" ");
Thread.sleep(3000);
System.out.println(" "+Thread.currentThread().getName()+" ");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
new Thread(){
public void run() {
try {
System.out.println(" "+Thread.currentThread().getName()+" ");
Thread.sleep(3000);
System.out.println(" "+Thread.currentThread().getName()+" ");
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
try {
System.out.println(" 2 ...");
latch.await();
System.out.println("2 ");
System.out.println(" ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
실행 결과:
Thread-0
Thread-1
2 ...
Thread-0
Thread-1
2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.