Java동시성과 스레드

Thread, Runnable, thread lifecycle

Java 스레드가 무엇인지, Thread와 Runnable의 역할이 어떻게 다르고 lifecycle을 어떻게 읽어야 하는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

java
Runnable task = () -> {
    System.out.println("work on " + Thread.currentThread().getName());
};

Thread thread = new Thread(task, "worker-1");
thread.start();
thread.join();

설명

  • 스레드는 하나의 프로세스 안에서 동시에 실행 흐름을 나누는 단위입니다. Java 프로그램이 기본적으로 main thread 하나에서 시작하고, 필요하면 다른 thread를 추가로 만들 수 있습니다.
  • Runnable은 "무슨 일을 할지"를 표현하고, Thread는 "그 일을 실행하는 실제 실행 컨테이너"에 가깝습니다. 그래서 현대 Java에서는 작업 로직을 Runnable이나 Callable로 분리하는 편이 더 자연스럽습니다.
  • start()는 새 thread에서 run()을 실행하게 만들지만, run()을 직접 호출하면 그냥 현재 thread에서 일반 메서드 호출처럼 실행됩니다. 입문자가 자주 하는 실수입니다.
  • thread lifecycle을 엄밀히 외우기보다, new -> runnable/running -> blocked/waiting -> terminated 정도의 흐름을 이해하는 것이 중요합니다. CPU를 계속 잡는다고 항상 일이 빨라지는 것은 아니며, lock 대기나 I/O 대기 상태도 많습니다.
  • 직접 Thread를 많이 만드는 방식은 교육적으로는 좋지만, 실무에서는 보통 ExecutorService나 framework가 thread 생명주기를 관리하게 맡깁니다.

빠른 정리

요소역할
Runnable반환값 없는 작업 정의
Thread작업을 실제로 실행하는 thread
start()새 thread에서 실행 시작
join()다른 thread 종료까지 대기
currentThread()현재 실행 중인 thread 확인

주의할 점

run()을 직접 호출하면 새 thread가 생기지 않습니다. "비동기로 실행한다"는 의도라면 반드시 start()와 lifecycle 제어를 함께 생각해야 합니다.

참고 링크

3 sources