본문 바로가기
Backend/Java

[Java] ☕ Thread 정리: 메서드, 생명주기, 제어 방법

by 제이동 개발자 2025. 4. 7.
728x90

[Java] ☕ Thread 정리: 메서드, 생명주기, 제어 방법

 멀티스레드는 자바에서 병렬 처리를 구현하는 핵심 개념 중 하나다. 이 글에서는 Thread 클래스가 제공하는 주요 메서드부터, 스레드의 생명주기 및 제어 방법까지 핵심만 정리해서 소개한다.

 

 

🧵 1. Thread 클래스가 제공하는 주요 메서드

 자바의 Thread 클래스는 스레드 실행을 위한 다양한 메서드를 제공한다. 목적에 따라 크게 3가지 범주로 나눌 수 있다.

 

1-1. ✅ 실행 관련 메서드

메서드 설명
start() 새로운 스레드를 시작하고, 내부적으로 run()을 호출한다.
run() 스레드에서 실행할 실제 작업을 정의한다. 직접 호출하면 멀티스레드가 아님.
join() 해당 스레드가 종료될 때까지 현재 스레드를 일시 중지시킨다.
join(long millis) 일정 시간까지만 대기한다. 시간 초과 시 계속 실행.

 

1-2. ⚙️ 제어 및 상태 관련 메서드

메서드 설명
sleep(long millis) 현재 스레드를 지정한 시간 동안 멈춘다. InterruptedException 발생 가능.
interrupt() 해당 스레드에 인터럽트를 걸어 종료 요청을 보낸다. 직접 멈추진 않음.
isInterrupted() 인터럽트 상태인지 확인한다. 상태는 그대로 유지된다.
interrupted() 현재 스레드의 인터럽트 상태를 확인하고, 초기화한다.
isAlive() 스레드가 실행 중인지 여부를 확인한다.
yield() 현재 스레드가 CPU를 다른 스레드에 양보할 의향을 나타낸다.

 

1-3. 📛 정보 조회 및 설정 메서드

메서드 설명
setName(String name)
getName()
스레드 이름 설정 및 조회.
setPriority(int priority)
getPriority()
스레드 우선순위 설정 및 조회. (1~10)
getId() 스레드 고유 ID 조회.
getState() 현재 스레드 상태 조회.
getThreadGroup() 스레드가 속한 ThreadGroup 조회.

 

1-4. 👻 데몬 관련 메서드

메서드 설명
setDaemon(true) 데몬 스레드로 지정. 반드시 start() 이전에 호출해야 함.
isDaemon() 데몬 여부 확인.

 

 

🔁 2. 스레드 생명주기 (Thread Lifecycle)

 자바 스레드는 다음과 같은 상태를 가진다. 이 상태는 getState()로 확인할 수 있다.

Thread Lifecycle

 

상태 설명
NEW Thread 객체가 생성되었지만 start()가 호출되지 않은 상태.
RUNNABLE 실행 가능 상태. JVM이 스케줄링하면 곧 실행됨.
RUNNING CPU를 점유하고 실제 실행 중인 상태. (엄밀히 말하면 JVM이 RUNNABLE과 구분하지 않음)
BLOCKED 모니터 락을 얻지 못해 대기 중인 상태.
WATING 다른 스레드의 동작을 무기한 기다리는 상태 (join(), wait() 등).
TIMED_WATING 일정 시간만 기다리는 상태 (sleep(), join(시간) 등).
TERMINATED 실행이 종료된 상태. 더 이상 재사용 불가.

 

 

🛠️ 3. 스레드 제어 방법

 스레드를 원하는 대로 동작시키기 위해 제어하는 몇 가지 주요 제어 방법이 있다.

 

1️⃣ sleep()

 스레드를 일정 시간 일시 정지시킨다.

Thread.sleep(1000); // 1초 대기

 

2️⃣ interrupt()

 스레드에게 "작업을 그만하라"는 요청을 보낸다. 직접 멈추는 것이 아니라, InterruptedException을 발생시켜 종료시키는 것과 같다.

Thread t = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        // 반복 작업
    }
});
t.start();
t.interrupt();	// 종료 요청, InterruptedException 예외 발생

 

3️⃣ join()

 해당 스레드의 작업이 끝날 때까지 대기한다. 병렬 실행 시 조건에 따라 스레드 작업이 끝난 후 진행하도록 할 수 있다.

Thread t1 = new Thread(() -> doSomething());	// 약 3초 걸리는 작업
Thread t2 = new Thread(() -> doSomething());	// 약 3초 걸리는 작업

t1.start();
t1.join(); // t1가 끝날 때까지 main 대기


t2.start();
t2.join(); // t2가 끝날 때까지 main 대기             // 약 6초 걸림


////////////////////////////////////////////////////
Thread t1 = new Thread(() -> doSomething());	// 약 3초 걸리는 작업
Thread t2 = new Thread(() -> doSomething());	// 약 3초 걸리는 작업

t1.start();
t2.start();

t1.join(); // t1가 끝날 때까지 main 대기
t2.join(); // t2가 끝날 때까지 main 대기             // 약 3초 걸림

 

 

🧩 마무리: 언제 어떤 메서드를 써야 할까?

  • 병렬 작업 실행: start(), join()
  • 일정 시간 대기: sleep()
  • 강제 종료 요청: interrupt()
  • 백그라운드 작업: setDaemon(true)
  • 상태 확인 및 디버깅: getState(), getName(), getId()

 

 

 

 

 

 

728x90