이 글은 주로 자바 동기화, 비동기, 차단, 비차단 분석 관련 정보를 소개합니다. 필요한 친구는
자바 동기화, 비동기, 차단 및 비차단 분석
요약:
일반적인 상황에서 우리 프로그램은 동기식 및 비차단 방식으로 실행됩니다. 그러나 우리 프로그램에는 복잡한 계산(10억에서 10억 사이의 소수 찾기)과 프로그램 자체가 제어할 수 없는 작업(IO 작업, 네트워크 요청)과 같이 항상 시간이 많이 걸리는 작업이 있습니다. 시간이 많이 걸리는 작업을 포함하는 메서드를 차단 메서드라고 하고, 시간이 많이 걸리는 작업을 포함하는 작업을 차단 작업이라고 합니다. 차단과 비차단은 시간이 걸리는지 여부에 따라 정의됩니다.코드 예
시뮬레이트된 네트워크 요청:
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!