네, run() 메서드는 start() 없이 직접 호출하는 것이 가능합니다. 다만 두 방식에는 중요한 차이가 있으며, 아래 예제를 통해 자세히 살펴보겠습니다.
예제
class my_thread extends Thread{
public void run(){
try{
System.out.println ("The thread " + Thread.currentThread().getId() + " is currently running");
}
catch (Exception e){
System.out.println ("The exception has been caught");
}
}
}
public class Main{
public static void main(String[] args){
int n = 6;
for (int i=1; i<n; i++){
my_thread my_object = new my_thread();
my_object.run();
}
}
}
출력 결과
The thread 1 is currently running The thread 1 is currently running The thread 1 is currently running The thread 1 is currently running The thread 1 is currently running
코드 설명
위 코드에서 'my_thread' 클래스는 Thread 클래스를 상속하며, 그 안에는 현재 실행 중인 스레드의 ID를 출력하는 run() 메서드가 정의되어 있습니다. try-catch 블록은 실행 과정에서 발생할 수 있는 예외를 잡아내어 관련 오류 메시지를 화면에 표시합니다.
main 메서드에서는 'for' 루프를 다섯 번 반복하면서 'my_thread' 객체를 새로 생성하고, 각 객체에 대해 run() 메서드를 직접 호출합니다.
run() 직접 호출과 start() 호출의 차이점
출력 결과를 보면 모든 메시지가 스레드 1, 즉 메인 스레드에서 출력된 것을 확인할 수 있습니다. run()을 직접 호출하면 새로운 스레드가 생성되지 않고, 일반 메서드 호출과 마찬가지로 현재 실행 중인 스레드(메인 스레드)에서 순차적으로 실행되기 때문입니다.
반면 start() 메서드를 호출하면 JVM이 새로운 스레드를 생성하고, 해당 스레드가 run() 메서드를 실행합니다. 따라서 진정한 멀티스레딩을 구현하려면 반드시 start()를 사용해야 하며, run()을 직접 호출하는 것은 단순한 메서드 호출에 불과하여 병렬 처리의 이점을 얻을 수 없습니다.