이미지 출처 :: 👩💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
Synchronous
)Asynchronous
)I/O
작업과 같은 느린 작업이 발생할 때, 기다리지 않고 다른 작업을 처리하면서 동시에 처리하여 멀티 작업을 진행할 수 있기 때문에, 전반적인 시스템 성능 향상에 도움을 줄 수 있다.이미지 출처 :: 👩💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
이미지 출처 :: 👩💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
block
(차단, 대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점 Non-Blocking
)console.log("시작");
setTimeout(() => {
console.log("1초 후에 실행됩니다!");
}, 1000);
console.log("끝");
// 시작
// 끝
// 1초 후에 실행됩니다.
Asynchronouse
) 관점setTimeout()
함수에 대해 작업 완료 여부를 신경 쓰지 않고 바로 다음 cosnole
작업을 진행한다.Non-blocking
) 관점setTimeout()
함수는 타이머 작업을 수행하기 위해 메인 함수를 블락하지 않고 백그라운드에서 별도로 처리된다.setTimeout()
함수를 호출하고 바로 그 다음 콘솔 함수를 호출한다.callee
)가 호출한 함수(caller
)에게 제어권을 바로 주느냐 안 주느냐에 따라 구분된다.
이미지 출처 :: 👩💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
Block
)이미지 출처 :: 👩💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
Sync + Blocking
)Blocking
), 다른 작업의 완료 여부를 바로 받아 순차적으로 처리하는 (Sync
) 방식console.log('1');
console.log('2');
console.log('3');
Sync + Non-Blocking
)Non Blocking
), 다른 작업의 결과를 바로 처리하여 작업을 순차대로 수행 하는 (Sync
) 방식// Runnable 인터페이스를 구현하는 클래스 정의
class MyTask implements Runnable {
@Override
public void run() {
// 비동기로 실행할 작업
System.out.println("Hello from a thread!");
}
}
public class Main {
public static void main(String[] args) {
// Thread 객체 생성
Thread thread = new Thread(new MyTask());
// 스레드 실행
thread.start();
// Non-Blocking이므로 다른 작업 계속 가능
System.out.println("Main thread is running...");
// Sync를 위해 스레드의 작업 완료 여부 확인
while (thread.isAlive()) {
System.out.println("Waiting for the thread to finish...");
}
System.out.println("Thread finished!");
System.out.println("Run the next tasks");
}
}
// Main thread is running..
// Waiting for the thread to finish...
// Waiting for the thread to finish...
// Waiting for the thread to finish...
// Waiting for the thread to finish...
// Hello from a thread!
// Thread finished!
// Run the next tasks
Thread
) 객체를 만들어 요청 작업을 백그라운드에 돌게 하고 메인 메서드에서 while
문을 통해 스레드가 모두 처리되었는지 끊임없이 확인하고, 처리가 완료되면 다음 메인 작업을 수행한다. Async + Blocking
)Blocking
), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 (Async
) 방식Async + Non-Blocking
)function foo() {
console.log("Async");
}
setTimeout(foo, 3000); // 3초 뒤 실행
console.log("Non-Blocking");
// Non-Blocking
// Async
foo()
는 콜백 함수로, 함수를 호출한 쪽에서 처리하지 않고, setTimeout()
이 실행되고 나면 콜백함수를 통해서 알아서 결과가 처리된다.setTimeout()
이 수행되는 것을 기다리지 않고 바로 아래의 'Non-Blocking' 문구가 출력된다. 출처
백엔드 개발자들이 알아야할 동시성 2 — 블로킹과 논블로킹, 동기와 비동기
👩💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
동기/비동기 VS 블로킹/논블로킹
블로킹 Vs. 논블로킹, 동기 Vs. 비동기
Callback함수란?? 뭔데??
[network] 동기vs비동기, 블로킹vs논블로킹의 차이