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()
로 확인할 수 있다.
상태 | 설명 |
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
'Backend > Java' 카테고리의 다른 글
[Java] ☕ Executor 프레임 워크 (1) | 2025.04.27 |
---|---|
[Java] 🚦 자바 메모리 가시성(Java Memory Visibility) (1) | 2025.04.20 |
[Java] 🧵 Thread 기본 개념 (0) | 2025.04.06 |
[Java] (2) 시간, 날짜 관련 API(LocalTime, LocalDate, LocalDateTime) (0) | 2023.08.20 |
[Java] (1) 시간, 날짜 관련 API(LocalTime, LocalDate, LocalDateTime) (0) | 2023.08.19 |