비동기 프로그래밍 -countDownLatch를 사용하여 비동기 멀티스레드 결과를 동기화하여 반환

3168 단어
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          
       

좋은 웹페이지 즐겨찾기