JAVA 80%

Thread control

lshjju 2025. 11. 5. 20:47

일꾼들을 효율적으로 관리하고 통제하는 **'관리자의 기술'**

쓰레드의 상태를 파악하고, 안전하게 멈추거나 배경 업무를 맡기는 법



📘 쓰레드 제어: "일꾼 관리의 정석"

1. Thread State (쓰레드의 상태)

쓰레드는 생성부터 소멸까지 여러 가지 상태를 거칩니다. 이를 이해해야 정확한 제어가 가능합니다.

  • NEW: 쓰레드 객체는 생성되었지만 아직 start() 전인 상태.
  • RUNNABLE: 실행 중이거나 실행 대기 중인 상태.
  • WAITING / TIMED_WAITING: 다른 쓰레드의 신호를 기다리거나 설정된 시간 동안 멈춘 상태.
  • TERMINATED: 실행이 완료되어 소멸된 상태.

2. Pause a Thread (쓰레드 일시 정지)

실행 중인 쓰레드를 잠시 멈추게 하는 방법입니다. 주로 Thread.sleep()이나 yield(), join() 등을 사용합니다.

Java
 
public class PauseExample {
    public static void main(String[] args) {
        Thread worker = new Thread(() -> {
            try {
                System.out.println("일꾼: 3초간 휴식합니다...");
                // 밀리세컨드 단위 (1000ms = 1s)
                Thread.sleep(3000); 
                System.out.println("일꾼: 다시 일을 시작합니다!");
            } catch (InterruptedException e) {
                System.out.println("일꾼: 휴식 중에 방해받았습니다!");
            }
        });
        worker.start();
    }
}

3. Safe Thread Termination (안전한 쓰레드 종료)

예전에는 stop() 메서드를 썼지만, 이는 데이터 손상의 위험이 있어 지금은 **사용이 금지(Deprecated)**되었습니다. 현대 자바에서는 두 가지 안전한 방법을 권장합니다.

  1. 상태 플래그(flag) 사용: boolean 변수를 이용해 스스로 멈추게 유도.
  2. interrupt() 메서드 사용: 일시 정지 상태인 쓰레드에 예외를 발생시켜 깨우고 종료시킴.
Java
 
public class SafeStopExample extends Thread {
    private boolean stop = false; // 종료 플래그

    public void setStop(boolean stop) { this.stop = stop; }

    @Override
    public void run() {
        while (!stop) {
            System.out.println("작업 중...");
            // 혹은 if (Thread.interrupted()) break; 를 사용하기도 함
        }
        System.out.println("자원을 정리하고 안전하게 종료합니다.");
    }
}

4. Daemon Thread (데몬 쓰레드: 배경 일꾼)

  • 설명: 주인이 죽으면 함께 죽는 '운명 공동체' 쓰레드입니다.
  • 특징: 메인 쓰레드(주인)가 종료되면 데몬 쓰레드는 작업이 남았어도 자동으로 강제 종료됩니다.
  • 활용: 가비지 컬렉터, 자동 저장, 화면 갱신 등 보조적인 역할을 맡길 때 씁니다.
Java
 
public class DaemonExample {
    public static void main(String[] args) {
        Thread daemon = new Thread(() -> {
            while (true) {
                System.out.println("배경 작업(자동 저장) 실행 중...");
                try { Thread.sleep(500); } catch (Exception e) {}
            }
        });

        daemon.setDaemon(true); // 반드시 start() 전에 설정해야 함!
        daemon.start();

        // 메인 쓰레드가 3초 뒤 종료되면 데몬 쓰레드도 즉시 멈춥니다.
        try { Thread.sleep(3000); } catch (Exception e) {}
        System.out.println("메인 쓰레드 종료 - 데몬도 함께 종료됩니다.");
    }
}

👨‍🏫 쉽게 이해하는 핵심 포인트

  1. sleep()은 항상 try-catch가 필요합니다: 잠자는 도중에 누군가 깨울 수 있기 때문에(InterruptedException) 이에 대한 대비가 필수입니다.
  2. 데몬 설정은 시작 전에!: start()를 호출한 뒤에 setDaemon(true)를 호출하면 에러(IllegalThreadStateException)가 발생합니다.
  3. 강제 종료보다는 스스로 종료하게: 일꾼을 강제로 끌어내는 것(stop)보다, 일이 끝났음을 알리고 스스로 정리하게 만드는 것(flag나 interrupt)이 가장 좋은 코드입니다.

오늘의 요약

  • Thread State를 알면 일꾼이 왜 안 움직이는지 파악할 수 있다.
  • **sleep()**은 정해진 시간 동안 일꾼을 재운다.
  • Safe Termination을 위해 stop() 대신 플래그나 interrupt()를 쓴다.
  • Daemon Thread는 메인 쓰레드를 보조하며, 주인이 끝나면 자동으로 사라진다.

이제 쓰레드라는 까다로운 일꾼들을 완벽하게 제어할 수 있는 관리자가 되셨습니다!


'JAVA 80%' 카테고리의 다른 글

LIFO/FIFO collection - Stack - Queue  (0) 2025.11.06
Collection framework  (0) 2025.11.05
java.util package  (0) 2025.11.05
java.lang package  (0) 2025.11.05
Anonymous object  (0) 2025.11.05