자바 동기 화,비동기,차단 및 비 차단 분석

자바 동기 화,비동기,차단 및 비 차단 분석
개요:
정상 적 인 상황 에서 우리 의 프로그램 은 동기 화 비 차단 방식 으로 실행 되 고 있다.그러나 우리 프로그램 은 복잡 한 계산(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! 
 읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기