Java

I/O 블로킹

1space 2025. 6. 27. 10:16

자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.

 

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