🧵 Thread란?

정의

Thread는 프로세스 안에서 실제 작업을 수행하는 실행 흐름의 단위이다. 하나의 프로세스 안에서 여러 작업을 동시에 처리할 수 있게 해준다.

✅ Thread 종류

Non-Daemon Thread

  • 일반적인 작업을 수행하는 스레드다.
  • 이 스레드가 남아 있으면 JVM은 종료되지 않는다.

Daemon Thread

  • 백그라운드 보조 작업을 수행하는 스레드다.
  • 모든 Non-Daemon Thread가 종료되면 함께 종료된다.

포인트

Thread를 이해할 때는 실제 일을 하는 스레드보조 역할 스레드를 구분하면 좋다.

✅ Thread 생명주기 (LifeCycle)

image

주요 상태

  • NEW: 스레드 객체가 생성된 상태
  • RUNNABLE: 실행 가능한 상태
  • BLOCKED: 락을 기다리는 상태
  • WAITING: 다른 스레드를 기다리는 상태
  • TIMED_WAITING: 일정 시간 동안 대기하는 상태
  • TERMINATED: 실행이 끝난 상태

✅ Thread 상태 요약

상태 설명
NEW new Thread()로 생성만 된 상태
RUNNABLE 실행 대기 또는 실행 중인 상태
BLOCKED monitor lock을 기다리는 상태
WAITING 다른 스레드의 신호를 기다리는 상태
TIMED_WAITING 시간 제한이 있는 대기 상태
TERMINATED 작업이 끝난 상태

✅ Thread 우선순위

  • 스레드에는 우선순위를 줄 수 있다.
  • 숫자가 높다고 반드시 먼저 실행되는 것은 아니다.
  • 운영체제 스케줄러와 JVM 정책의 영향을 받는다.
Thread thread = new Thread(() -> {
    System.out.println("작업 수행");
});
thread.setPriority(Thread.MAX_PRIORITY);
thread.start();

정리

우선순위는 힌트에 가깝고, 절대적인 실행 순서를 보장하지 않는다.

✅ Thread 사용 시 주의사항

  • 공유 자원 접근 시 동기화를 고려한다.
  • 경합 상태와 교착 상태를 주의한다.
  • 너무 많은 스레드는 오히려 성능을 떨어뜨릴 수 있다.
  • 필요한 경우 ThreadPoolExecutor 또는 Spring @Async를 활용한다.

🛠️ 기본 생성 예시

Thread thread = new Thread(() -> {
    System.out.println("별도 스레드에서 실행");
});

thread.start();

🧩 join 예시

Thread thread = new Thread(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
});

thread.start();
thread.join();
System.out.println("스레드 종료 후 실행");

⚠️ 주의할 점

  • 공유 데이터는 반드시 안전하게 다뤄야 한다.
  • sleep()wait()의 차이를 이해해야 한다.
  • 락을 오래 잡고 있으면 성능이 떨어질 수 있다.
  • 무분별한 스레드 생성은 자원 낭비가 될 수 있다.

[!important] 정리 Thread는 프로세스 내부의 실행 흐름이며, 멀티스레드 환경에서는 상태와 동기화를 함께 이해해야 한다.


연결문서

댓글남기기