자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
I/O 블로킹이란?
- I/O는 Input/Output, 즉 사용자 입력 또는 출력 같은 작업입니다.
- 자바에서 JOptionPane.showInputDialog() 같은 입력 함수는 사용자의 입력을 기다리는 동안 아무 일도 하지 않고 멈춥니다 → 이것이 블로킹(Blocking) 현상입니다.
싱글 쓰레드 I/O 블로킹
class ThreadEx6 {
public static void main(String[] args) {
// (A) 사용자에게 입력받음 (blocking 발생)
String input = JOptionPane.showInputDialog("입력하세요...");
System.out.println("입력하신 값은 " + input + "입니다.");
// (B) 카운트다운 출력
for (int i = 10; i > 0; i--) {
System.out.println(i);
try { Thread.sleep(1000); } catch (Exception e) {}
}
}
}
설명:
- 이 프로그램은 단 1개의 main 쓰레드만 사용합니다.
- 사용자 입력을 기다리는 동안 showInputDialog()에서 main 쓰레드가 멈춰버림 → 그동안 아무 일도 하지 않음
- 그래서 카운트다운(B)은 입력 후에야 실행됩니다.
Call Timeline:
- A: 사용자 입력 대기 → 회색 영역: 아무 일도 하지 않는 블로킹 상태
- B: 입력이 끝난 후 카운트다운 시작
- 총 실행 시간: t2 - t0 (입력 + 카운트다운)
멀티 쓰레드로 분리하여 블로킹 해소
class ThreadEx7 {
public static void main(String[] args) {
ThreadEx7_1 th1 = new ThreadEx7_1();
th1.start(); // (B) 카운트다운을 별도 쓰레드에서 시작
// (A) 사용자 입력
String input = JOptionPane.showInputDialog("입력하세요...");
System.out.println("입력하신 값은 " + input + "입니다.");
}
}
class ThreadEx7_1 extends Thread {
public void run() {
for (int i = 10; i > 0; i--) {
System.out.println(i);
try { sleep(1000); } catch (Exception e) {}
}
}
}
설명:
- 이번에는 쓰레드를 2개로 분리:
- main 쓰레드는 사용자 입력을 받음
- th1 쓰레드는 카운트다운 출력
- main이 블로킹되어도 th1은 계속 동작하므로, 입력 대기 중에도 카운트다운이 진행됨
Call Timeline:
- A: main 쓰레드가 입력 대기 (블로킹)
- B: 동시에 th1은 카운트다운 실행
- 결과적으로 카운트다운과 입력 대기가 동시에 진행되어 전체 소요시간이 줄어듦
- 실행 시간: t2' - t1' < t2 - t0
요약
항목 | 싱글 쓰레드 | 멀티 쓰레드 |
I/O 대기 중 | CPU도 같이 멈춤 | 다른 쓰레드가 일함 |
자원 활용 | 비효율적 (낭비) | 효율적 |
전체 실행 시간 | 길어짐 | 줄어듦 |
'Java' 카테고리의 다른 글
쓰레드 그룹 (0) | 2025.06.27 |
---|---|
쓰레드 우선순위 (0) | 2025.06.27 |
싱글 쓰레드와 멀티 쓰레드 (0) | 2025.06.27 |
쓰레드의 구현과 실행 (0) | 2025.06.27 |
쓰레드 (0) | 2025.06.27 |