우선 앞전 블로그에서 start() 메서드를 호출했을때 , 실행과정을 보았다. 이번 블로그는
run() 을 실행했을때 , 어떤 차이점인지 설명하는 글이다.

run() 메서드를 호출 했을 시

package thread.start;
public class BadThreadMain {
 public static void main(String[] args) {
 System.out.println(Thread.currentThread().getName() + ": main() start");
 HelloThread helloThread = new HelloThread();
 System.out.println(Thread.currentThread().getName() + ": run() 호출 전");
 helloThread.run(); // run() 직접 실행
 System.out.println(Thread.currentThread().getName() + ": run() 호출 후");
 System.out.println(Thread.currentThread().getName() + ": main() end");
 }
}

실행결과 🔽
main: main() start
main: run() 호출 전
main: run() <- 메인스레드에서 진행됨.
main: run() 호출 후
main: main() end

아래의 그림을 보면 별도의 스텍프레임이 생성되지않고 메인 스레드의 스텍프레임에서 진행됨.

  • 실행 결과를 잘 보면 별도의 스레드가 run() 을 실행하는 것이 아니라, main 스레드가 run() 메서드를 호출할 것을 확인할 수 있다.

  • 자바를 처음 실행하면 main 스레드가 main() 메서드를 호출하면서 시작한다

  • main 스레드는 HelloThread 인스턴스에 있는 run() 이라는 메서드를 호출한다.

  • main 스레드가 run() 메서드를 실행했기 때문에 main 스레드가 사용하는 스택위에 run() 스택 프레임이 올라간다.

결과적으로 main 스레드에서 모든 것을 처리한 것이 된다. 🔽

포인트 🌞

스레드의 start() 메서드는 스레드에 스택 공간을 할당하면서 스레드를 시작하는 아주 특별한 메서드이다. 그리고 해당 스레드에서 run() 메서드를 실행한다. 따라서 main 스레드가 아닌 별도의 스레드에서 재정의한 run() 메서 드를 실행하려면, 반드시 start() 메서드를 호출해야 한다.

profile
Live the moment for the moment.

0개의 댓글