Thread 객체의 run() 메소드를 직접 호출하면 별도의 새로운 스레드가 시작되지 않으며, 해당 코드는 현재 실행 중인 스레드 안에서 그대로 실행됩니다. 별도의 스레드 내에서 Runnable.run()을 실행하려면 다음 두 가지 방법 중 하나를 사용해야 합니다.
- Runnable 객체를 이용해 Thread 객체를 생성한 뒤, 해당 Thread의 start() 메소드를 호출합니다.
- Thread 클래스를 상속하는 하위 클래스를 정의하고 run() 메소드를 오버라이드합니다. 그런 다음 이 하위 클래스의 인스턴스를 생성하고 해당 인스턴스의 start() 메소드를 직접 호출합니다.
예제 코드
public class ThreadRunMethodTest {
public static void main(String args[]) {
MyThread runnable = new MyThread();
runnable.run(); // run() 메소드 호출은 별도의 스레드를 시작하지 않음
System.out.println("Main Thread");
}
}
class MyThread extends Thread {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Child Thread interrupted.");
}
System.out.println("Child Thread");
}
}위 예제에서 메인 스레드인 ThreadRunMethodTest는 run() 메소드를 통해 자식 스레드인 MyThread를 호출합니다. 이 경우 자식 스레드의 작업이 완료될 때까지 메인 스레드의 나머지 코드는 실행되지 않으므로, "Main Thread"보다 "Child Thread"가 먼저 출력됩니다.
실행 결과
Child Thread Main Thread
만약 start() 메소드를 호출했다면 JVM이 새로운 스레드를 생성하여 run() 메소드를 병렬로 실행했을 것이고, 출력 순서는 실행 시점에 따라 달라질 수 있습니다. 따라서 멀티스레딩이 실제로 필요한 경우에는 반드시 run()이 아닌 start()를 호출해야 한다는 점을 기억하세요.