출처 - https://poiemaweb.com/js-async
동기와 비동기식 처리에 대한 가장 쉬운 예시는 위 이미지를 참고하면 좋다.
하지만 이렇게만 알기보단 조금 더 디테일하게 알아보자
동기식 처리 모델 (Synchronous processing model)은 직렬적으로 Task를 수행한다.
package Synchro_Asynchro;
public class Synchro {
public static void main(String[] args) {
method1();
method2();
method3();
}
public static void method1() {
System.out.println("method1");
}
public static void method2() {
System.out.println("method2");
}
public static void method3() {
System.out.println("method3");
}
}
method1
method2
method3
자바의 특성으로 위에서 아래로 내려오면서 코드가 main문에서 작성한 순서대로 메서드를 실행하게 된다.
비동기식 처리 모델 (Asynchronous processing model or Non-Blocking processing model)은 병렬적 Task를 수행한다.
즉, Task가 종료되지 않은 상태라 하여도 대기하지 않고 다음 Task를 실행한다.
서버에서 데이터를 가져와 화면에 표시하는 Task를 수행할 때, 서버에 데이터를 요청한 이후 서버로부터
데이터가 응답될 때까지 대기하지 않고 즉시 다음 Task를 수행한다.
이후 서버로부터 데이터가 응답되면 이벤트가 발생하게되고 이벤트 핸들러가 데이터를 가지고 수행할 Task를 계속해 수행한다.
자바에선 Multi Thread의 동작이 비동기식으로 작동한다
packaage Sychro_Asynchro;
public class Asynchor {
public static void main(String[] args) {
Thread t = new Thread(() -> { method();
});
Thread t2 = new Thread(() -> { method2();
});
Thread t3 = new Thread(() -> { method3();
});
t.start();
t2.start();
t3.start();
}
public static void method1() {
System.out.println("method1");
}
public static void method2() {
System.out.println("method2");
}
public static void method3() {
System.out.println("method3");
}
}
위 코드는 각 메서드를 각각의 Thread 객체에 담아 start 메서드를 통해 각각의 메서드를 수행하게 된다.
위 코드를 실행하게 되면 자바의 Multi Thread의 비동기식 처리 되어, 처리 순서가 보장이 되지않는것을 확인할 수 있다.
장점으론 작업을 설계하거나 흐름에 대해 파악하기가 쉽고,
다른 스레드에서 접근할 수 없기 때문에 안정적인 작업이 가능하다 (Thread Safe)
장점으론 요청에 따른 결과에 반환되는 시간 동안 다른 작업을 수행할 수 있다.
동기식 처리와는 다르게 결과가 주어지는 시간이 걸리더라도 다른 작업 처리가 가능하니 자원을 효율적으로 사용할 수 있다
단점으론 동기식보다 설계가 복잡하다.