자바 동기 화,비동기,차단 및 비 차단 분석
개요:
정상 적 인 상황 에서 우리 의 프로그램 은 동기 화 비 차단 방식 으로 실행 되 고 있다.그러나 우리 프로그램 은 복잡 한 계산(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에 따라 라이센스가 부여됩니다.