Java 멀티스레드 비동기식 호출 방법

JAVA 플랫폼에서 비동기 호출을 실현하는 역할은 다음과 같은 세 가지가 있다. 호출자 선하증권의 실제 데이터
호출자가 호출 소모 시간을 조작하고 데이터를 즉시 되돌릴 수 없을 때, 먼저 선하증권을 되돌려줍니다.그리고 시간이 지나면 선하증권으로 진정한 데이터를 얻는다.
케이크 가게에 가서 케이크를 사면 케이크가 만들어질 때까지 기다릴 필요가 없고 (현재 만드는 데 시간이 오래 걸린다고 가정하면) 선하증권만 받으면 된다. (다른 일을 하러 가면) 케이크가 완성될 때까지 기다렸다가 선하증권을 가지고 케이크를 찾으면 된다.

public class Main {  
  public static void main(String[] args) {  
    System.out.println("main BEGIN");  
    Host host = new Host();  
    Data data1 = host.request(10, 'A');  
    Data data2 = host.request(20, 'B');  
    Data data3 = host.request(30, 'C');  
    System.out.println("main otherJob BEGIN");  
    try {  
      Thread.sleep(200);  
    } catch (InterruptedException e) {  
    }  
    System.out.println("main otherJob END");  
    System.out.println("data1 = " + data1.getContent());  
    System.out.println("data2 = " + data2.getContent());  
    System.out.println("data3 = " + data3.getContent());  
    System.out.println("main END");  
  }  
} 
이곳의main류는'고객'에 해당하고host는'케이크 가게'에 해당하며 고객이'케이크 가게'에 케이크를 주문하면'요청 요청request'에 해당한다. 되돌아오는 데이터 데이터는 Future Data의 실례로 진정한'케이크'가 아니라 주문서에 해당한다.일정 시간이 지난 후 (sleep 일정 시간 후) 데이터 호출 1.getContent (), 즉 선하증권으로 실행 결과를 얻습니다.
다음은 고객이 케이크를 주문한 후 케이크 가게에서 무엇을 했는지 살펴보겠습니다.

public class Host {  
  public Data request(final int count, final char c) {  
    System.out.println("request(" + count + ", " + c + ") BEGIN");  
    // (1)  FutureData   
    final FutureData future = new FutureData();  
    // (2)  RealData ,   
    new Thread() {                     
      public void run() {  
       // count、future、c。            
        RealData realdata = new RealData(count, c);  
        future.setRealData(realdata);  
      }                         
    }.start();                       
    System.out.println("request(" + count + ", " + c + ") END");  
    // (3)  FutureData , }  
    return future;  
  }  
} 
host("케이크 가게")는 요청을 받은 후에 선생은'선하증권'Future Data의 실례future가 되었다. 그리고'케이크 셰프'Real Data에게 케이크를 만들라고 명령했다. 리얼 데이터는 라인을 짜서 케이크를 만드는 것과 같다.그리고 호스트가 고객에게 되돌아오는 것은 케이크가 아니라'인하증권'퓨처일 뿐이다.케이크가 다 만들어진 후에야 케이크 셰프가 대응하는'인하증권'케이크, 즉future를 줄 수 있다.setRealData(realdata).
다음은 케이크 셰프가 어떻게 케이크를 만드는지 봅시다.
count의 c 문자를 포함하는 문자열을 만듭니다. 범법을 표현하기 위해 시간이 좀 걸리기 때문에sleep를 사용했습니다.

public class RealData implements Data {  
  private final String content;  
  public RealData(int count, char c) {  
    System.out.println("making RealData(" + count + ", " + c + ") BEGIN");  
    char[] buffer = new char[count];  
    for (int i = 0; i < count; i++) {  
      buffer[i] = c;  
      try {  
        Thread.sleep(1000);  
      } catch (InterruptedException e) {  
      }  
    }  
    System.out.println("making RealData(" + count + ", " + c + ") END");  
    this.content = new String(buffer);  
  }  
  public String getContent() {  
    return content;  
  }  
}
이제'인하증권'future가 케이크'content'에 어떻게 대응하는지 살펴보겠습니다.

public class FutureData implements Data {  
  private RealData realdata = null;  
  private boolean ready = false;  
  public synchronized void setRealData(RealData realdata) {  
    if (ready) {              
      return;   //  setRealData 。 
    }  
    this.realdata = realdata;  
    this.ready = true;  
    notifyAll();  
  }  
  public synchronized String getContent() {  
    while (!ready) {  
      try {  
        wait();  
      } catch (InterruptedException e) {  
      }  
    }  
    return realdata.getContent();  
  }  
}
고객은 자신의 일을 끝낸 후에 자신의 "인하증권"을 가지고 케이크를 찾는다.

System.out.println("data1 = " + data1.getContent()); 
이때 케이크가 완성되지 않으면 기다릴 수밖에 없다.

while (!ready) {  
      try {  
        wait();  
      } catch (InterruptedException e) {  
      }  
//    
return realdata.getContent(); 
프로그램 분석
모든 요청에 대해host는 하나의 라인을 생성하는데 이 라인은 고객이 필요로 하는'케이크'를 생성하는 것을 책임진다.한동안 기다린 후에 케이크가 아직 완성되지 않으면 고객은 반드시 기다려야 한다.케이크가 완성될 때까지, 즉future.setRealData(realdata); 집행 후에야 고객이 케이크를 가져갈 수 있다.
모든 라인은 특정 고객이 필요로 하는 케이크를 전문적으로 제작할 뿐이다.즉, 고객 A는 케이크 셰프 A, 고객 B는 케이크 셰프 B를 대응한다.고객 B의 케이크가 먼저 만들어져도 고객 A는 케이크 셰프 A가 케이크를 완성하기를 기다릴 수밖에 없다.다시 말하면 고객 사이에는 경쟁 관계가 없다.
클래스 Future Data의 두 가지 방법은synchronized로 설정되었다. 실제로 케이크 셰프 A와 고객 A 간의 상호 배척 관계, 즉 고객 A는 케이크 셰프 A가 케이크를 다 만든 후에야 가져갈 수 있고 케이크 셰프 B가 케이크를 다 만들었는지와 상관없다.
본고의 내용은 여기서 모두 끝났습니다. 코드는 간단합니다. 여러분이 자바 다중 스레드를 배워서 비동기 호출을 실현하는 데 도움이 되었으면 합니다. 감사합니다.

좋은 웹페이지 즐겨찾기