Java에서 멀티스레드를 사용하려면 Thread 클래스를 상속받아 새로운 스레드를 생성할 수 있습니다. 이때 중요한 점은 start() 메서드를 호출하면 새로운 스레드가 실행되며, run() 메서드를 직접 호출하지 않는다는 점입니다.
이번 글에서는 Thread 클래스를 상속받아 실행하는 간단한 예제를 통해 start()와 run()의 차이점을 이해해보겠습니다.
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()
여기서 중요한 점을 살펴보겠습니다.
🚀 start() vs run() 차이점
메서드 동작 방식
🔥 핵심 정리
✅ main 스레드는 start()를 호출하여 새로운 스레드에게 실행을 지시할 뿐, 직접 run()을 실행하지 않는다.
✅ start()를 호출하면 새로운 스레드가 생성되고, run()이 실행된다.
✅ 스레드 실행 순서는 보장되지 않는다.
멀티스레드를 사용할 때는 스레드의 실행 흐름을 예측하기 어렵다는 점을 항상 염두에 두어야 합니다!