자바 동기 화,비동기,차단 및 비 차단 분석
개요:
정상 적 인 상황 에서 우리 의 프로그램 은 동기 화 비 차단 방식 으로 실행 되 고 있다.그러나 우리 프로그램 은 복잡 한 계산(1 억 에서 10 억 사이 의 소 수 를 찾 아 라)과 프로그램 자체 가 제어 할 수 없 는 조작(IO 조작,네트워크 요청)등 시간 이 걸 릴 수 있다.이러한 시간 소모 작업 을 포함 하 는 방법 을 우 리 는 그것 을 차단 방법 이 라 고 할 수 있 으 며,이러한 시간 소모 작업 을 포함 하 는 임 무 를 우 리 는 그것 을 차단 임무 라 고 할 수 있다.차단 과 비 차단 은 시간 이 걸 릴 지 여 부 를 정의 합 니 다.
프로그램 에 대량의 차단 작업 이 존재 한다 면 프로그램의 성능 에 영향 을 줄 것 이다.그러나 막 힌 존 재 는 객관 적 인 사실 입 니 다.우리 의 프로그램 은 그것 을 바 꿀 수 없습니다.하나의 네트워크 요청 은 3 초가 걸 려 야 응답 할 수 있 습 니 다.우 리 는 그것 을 1 밀리초 만 에 응답 하 게 할 수 없습니다.왜냐하면 요청 을 받 은 서버 는 우리 가 전혀 통제 하지 않 을 수 있 기 때 문 입 니 다.그러나 우 리 는 차단 임 무 를 비동기 적 으로 처리 하 는 방식 을 바 꿀 수 있다.비동기 화 를 실현 하 는 주요 기술 은 다 중 스 레 드 다.그림:
 
 동기 화 와 비동기 화 는 순차 개념 이다.동기 화 는 한 가지 작업 만 수행 하 는 것 이 고,이 보 는 여러 가지 작업 을 동시에 수행 하 는 것 이다.
코드 예제
아 날로 그 네트워크 요청:
package com.zzj.asyn; 
 
public class HttpRequest { 
  private Callable callable; 
   
  public HttpRequest(Callable callable) { 
    this.callable = callable; 
  } 
   
  public void send(){ 
    //        
    try { 
      Thread.sleep(1000 * 5); 
    } catch (InterruptedException e) { 
      e.printStackTrace(); 
      Thread.currentThread().interrupt(); 
    } 
    //    
    this.callable.call("Hello world!"); 
  } 
   
  public interface Callable{ 
    void call(String result); 
  } 
} 
package com.zzj.asyn; 
 
import com.zzj.asyn.HttpRequest.Callable; 
 
/** 
 *              
 * @author lenovo 
 * 
 */ 
public class App { 
  public static void main(String[] args) { 
    new HttpRequest(new Callable() { 
      @Override 
      public void call(String result) { 
        System.out.println("Thread:" + Thread.currentThread().getName()); 
        System.out.println("Message from remote server:" + result); 
      } 
    }).send(); 
    System.out.println("Thread " + Thread.currentThread().getName() + " is over!"); 
  } 
} 
Thread:main 
Message from remote server:Hello world! 
Thread main is over! 
package com.zzj.asyn; 
 
import com.zzj.asyn.HttpRequest.Callable; 
 
/** 
 *              
 * @author lenovo 
 * 
 */ 
public class App2 { 
  public static void main(String[] args) { 
    new Thread(new Runnable() { 
      @Override 
      public void run() { 
        new HttpRequest(new Callable() { 
          @Override 
          public void call(String result) { 
            System.out.println("Thread:" + Thread.currentThread().getName()); 
            System.out.println("Message from remote server:" + result); 
          } 
        }).send(); 
      } 
    }).start(); 
    System.out.println("Thread " + Thread.currentThread().getName() + " is over!"); 
  } 
} 
Thread main is over! 
Thread:Thread-0 
Message from remote server:Hello world! 
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.