Java 멀티스레드: `Thread` 클래스의 `start()` 메서드 이해하기

JunSuPark·2025년 2월 12일

📝 개요

Java에서 멀티스레드를 사용하려면 Thread 클래스를 상속받아 새로운 스레드를 생성할 수 있습니다. 이때 중요한 점은 start() 메서드를 호출하면 새로운 스레드가 실행되며, run() 메서드를 직접 호출하지 않는다는 점입니다.

이번 글에서는 Thread 클래스를 상속받아 실행하는 간단한 예제를 통해 start()run()의 차이점을 이해해보겠습니다.


💻 코드 예제

1️⃣ Thread 클래스 상속하여 스레드 생성

package thread.start;

public class HelloThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + ": run()");
    }
}

Thread 클래스를 상속받아 HelloThread 클래스를 만듭니다.
run() 메서드를 오버라이딩하여 실행할 코드를 작성합니다.
Thread.currentThread().getName()을 사용해 현재 실행 중인 스레드의 이름을 출력합니다.

package thread.start;

public class HelloThreadMain {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + ": main() start");
        
        HelloThread helloThread = new HelloThread();  // 새로운 스레드 객체 생성
        System.out.println(Thread.currentThread().getName() + ": start() 호출 전");
        
        helloThread.start();  // 새로운 스레드를 시작
        
        System.out.println(Thread.currentThread().getName() + ": start() 호출 후");
        System.out.println(Thread.currentThread().getName() + ": main() end");
    }
}

📌 실행 결과 예측
실제 실행 결과는 OS와 JVM 스케줄러에 따라 달라질 수 있지만, 일반적으로 아래와 같은 순서로 실행됩니다.

main: main() start
main: start() 호출 전
main: start() 호출 후
main: main() end
Thread-0: run()

여기서 중요한 점을 살펴보겠습니다.

  • main 스레드가 실행되면서 HelloThread 객체를 생성합니다.
  • helloThread.start();를 호출하면 새로운 Thread-0 스레드가 시작됩니다.
  • start()를 호출한 직후 main 스레드는 바로 다음 코드로 진행하며, run()이 실행될 때까지 기다리지 않습니다.
  • Thread-0이 run() 메서드를 실행합니다.
  • 스레드 간 실행 순서는 보장되지 않습니다. 따라서 main() 종료 전에 Thread-0이 실행될 수도 있고, 그 후에 실행될 수도 있습니다.

🚀 start() vs run() 차이점
메서드 동작 방식

  • start() 새로운 스레드를 생성하고, run() 메서드를 실행하도록 함.
  • run() 단순히 메서드를 실행할 뿐, 새로운 스레드를 생성하지 않음.
    helloThread.run(); // ❌ 새로운 스레드가 생성되지 않음 (일반 메서드 호출)
    helloThread.start(); // ✅ 새로운 스레드를 생성하여 실행

🔥 핵심 정리
✅ main 스레드는 start()를 호출하여 새로운 스레드에게 실행을 지시할 뿐, 직접 run()을 실행하지 않는다.
✅ start()를 호출하면 새로운 스레드가 생성되고, run()이 실행된다.
✅ 스레드 실행 순서는 보장되지 않는다.

멀티스레드를 사용할 때는 스레드의 실행 흐름을 예측하기 어렵다는 점을 항상 염두에 두어야 합니다!

profile
배움을 추구하는 개발자

0개의 댓글