블록킹(Blocking)과 논블록킹(Non-Blocking)
블록킹(Blocking)
자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 주체의 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
1. 사원(=Thread)은 서류를 작성하여 상사(=Blocking)를 찾아가 검토를 요청했습니다.
2. 상사는 서류를 검토하는 동안 옆에서 기다리라고 지시한 뒤 서류를 검토합니다.
3. 사원은 상사가 검토를 마칠때 까지 기다립니다.
4. 상사는 서류를 검토한 뒤 사원에게 자리로 돌아가라고 지시합니다.
5. 사원은 자리로 돌아와 자신의 업무를 다시 시작할 수 있었습니다.
논블록킹(Non-Blocking)
다른 주체의 작업에 관련없이 자신의 작업을 하는 것
1. 사원(=Thread)은 서류를 작성하여 상사(=Non-Blocking)를 찾아가 검토를 요청했습니다.
2. 상사는 서류를 받아 검토를 시작하지만, 사원에게 옆에서 기다릴 필요가 없다고 말하며 바로 자리로 돌아가도 된다고 합니다.
3. 사원은 서류 검토가 끝날 때까지 기다리지 않고 바로 자리로 돌아와 다른 업무를 시작합니다.
4. 상사는 서류 검토를 끝낸 후, 사원에게 메일로 검토 결과를 전달합니다.
5. 사원은 메일을 확인한 후, 검토 결과에 따라 필요한 작업을 추가로 진행할 수 있었습니다.
블록킹과 논블록킹의 차이점 핵심요약
다른 주체가 작업할 때 자신의 제어권이 본인에게 있는지 여부로 정리할 수 있다.
싱크로너스(Synchronous)와 어싱크로너스(Asynchronous)
싱크로너스(Synchronous)
사전적 용어로는 동기라는 뜻을 가지며 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미한다.
1. 사원(=Thread)은 서류를 작성하여 상사(=Synchronous)를 찾아가 검토를 요청했습니다.
2. 사원은 서류 검토가 끝날때 까지 기다리거나 자리로 돌아가 다른 업무를 볼지 선택할 수 있습니다.
3. 상사는 서류 검토를 마치고 나서 결과를 바로 사원에게 전달합니다.
4. 사원은 검토 결과를 받은 후, 검토 결과를 가지고 바로 업무를 진행합니다.
어싱크로너스(Asynchronous)
사전적 용어로는 비동기라는 뜻을 가지며 시작, 종료가 일치하지 않고 끝나는 동시에 시작을 하지 않음을 의미한다.
1. 사원(=Thread)은 서류를 작성하여 상사(=Asynchronous)를 찾아가 검토를 요청했습니다.
2. 사원은 서류 검토가 끝날때 까지 기다리거나 자리로 돌아가 다른 업무를 볼지 선택할 수 있습니다.
3. 상사는 서류 검토를 마치고 나서 결과를 바로 사원에게 전달합니다.
4. 사원은 검토 결과를 받은 후, 검토 결과를 가지고 바로 업무를 할지 업무 B를 마무리하고 할지 결정할 수 있습니다.
싱크로너스와 어싱크로너스의 차이점 핵심요약
결과를 돌려주었을 때 순서와 결과에 관심이 있는지 아닌지 여부로 판단할 수 있다.
크로스오버를 통한 개념 정리하기
블록킹 & 싱크로너스
블록킹의 관점은 제어권이 자신에게 없는 것이고 싱크로너스의 관점은 결과를 바로 처리한다.
public class BlockingSynchronousExample {
public static void main(String[] args) {
// Scanner를 사용하여 사용자 입력을 동기적으로 받음
Scanner scanner = new Scanner(System.in);
System.out.println("메시지를 입력하세요: ");
String message = scanner.nextLine(); // 입력을 받을 때까지 블로킹됨
System.out.println("입력한 메시지: " + message);
System.out.println("입력 후 다음 작업을 진행할 수 있습니다.");
}
}
블록킹 & 어싱크로너스
블록킹의 관점은 제어권이 자신에게 없는 것이고 어싱크로너스의 관점은 결과를 처리 필요 유무에 따라 처리한다.
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
// 시간이 오래 걸리는 작업
Thread.sleep(2000);
return "Async 작업 완료";
});
// 결과를 기다리는 동안 메인 스레드는 블로킹됨
String result = future.get(); // 여기서 블로킹됨
System.out.println(result);
executor.shutdown();
}
넌블록킹 & 싱크로너스
넌블록킹의 관점은 제어권이 자신에게 있고 싱크로너스의 관점은 결과를 바로 처리한다.
public class NonBlockingSynchronousExample {
public static void main(String[] args) {
String result = syncTask(); // 즉시 반환됨
System.out.println(result);
System.out.println("다른 작업을 바로 시작할 수 있습니다.");
}
public static String syncTask() {
return "Sync 작업 완료"; // 바로 처리됨
}
}
넌블록킹 & 어싱크로너스
넌블록킹의 관점은 제어권이 자신에게 있고 어싱크로너스의 관점은 결과를 처리 필요 유무에 따라 처리한다.
public class NonBlockingAsynchronousExample {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// 비동기 작업
try {
Thread.sleep(2000); // 작업을 2초 동안 지연
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, World!";
}).thenAccept(result -> {
// 콜백: 작업이 완료되면 실행
System.out.println(result);
});
// 다른 작업을 바로 수행 (논블로킹)
System.out.println("Doing something else...");
// 메인 스레드가 바로 종료되지 않도록 대기
try {
Thread.sleep(3000); // 충분한 대기 시간
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
포스팅을 마치며
본 포스팅을 읽고 아래의 질문에 답변할 수 있는 것을 바랍니다🙏
- 블록킹과 논블록킹을 설명할 수 있다.
- 싱크로너스와 어싱크로너스를 설명할 수 있다.
- Java의 싱크로나이즈드(Syncronized)를 설명할 수 있다
- 자신이 작성한 코드 중 포스팅 내용을 토대로 설명을 할 수 있다.
'기초 CS 파훼하기' 카테고리의 다른 글
스레드(Thread)와 프로세스(Process) 파훼하기 (0) | 2024.10.21 |
---|