>Java >java지도 시간 >Java 동기화, 비동기, 차단 및 비차단 분석

Java 동기화, 비동기, 차단 및 비차단 분석

高洛峰
高洛峰원래의
2017-02-11 16:17:391443검색

이 글은 주로 자바 동기화, 비동기, 차단, 비차단 분석 관련 정보를 소개합니다. 필요한 친구는

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

요약:

일반적인 상황에서 우리 프로그램은 동기식 및 비차단 방식으로 실행됩니다. 그러나 우리 프로그램에는 복잡한 계산(10억에서 10억 사이의 소수 찾기)과 프로그램 자체가 제어할 수 없는 작업(IO 작업, 네트워크 요청)과 같이 항상 시간이 많이 걸리는 작업이 있습니다. 시간이 많이 걸리는 작업을 포함하는 메서드를 차단 메서드라고 하고, 시간이 많이 걸리는 작업을 포함하는 작업을 차단 작업이라고 합니다. 차단과 비차단은 시간이 걸리는지 여부에 따라 정의됩니다.


프로그램에 차단 작업이 많으면 프로그램 성능에 영향을 미칩니다. 그러나 차단의 존재는 객관적인 사실이며 우리 프로그램은 이를 변경할 수 없습니다. 네트워크 요청이 응답하는 데 3초가 걸립니다. 요청을 수락하는 서버가 완전히 제어할 수 없기 때문에 우리는 1밀리초 안에 응답하도록 할 수 없습니다. 그러나 차단을 처리하는 방식을 변경할 수 있습니다. 즉, 차단 작업을 비동기적으로 처리할 수 있습니다. 비동기 구현을 달성하는 주요 기술은 멀티스레딩입니다. 그림:

java 同步、异步、阻塞和非阻塞分析

동기화와 비동기성은 타이밍 개념입니다. 동기화는 동시에 하나의 작업만 실행하는 것을 의미하고, 비동기는 동시에 여러 작업을 실행하는 것을 의미합니다.


코드 예

시뮬레이트된 네트워크 요청:

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!

읽어주셔서 감사합니다. 모두에게 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!

자바 동기화, 비동기, 차단 및 비차단 분석과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.