gloryyam 님의 블로그

[Thread] run() vs start() 본문

Backend/Java

[Thread] run() vs start()

gloryyam 2024. 8. 27. 15:17

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 대시보드 - 인프런 (inflearn.com)

 

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성 강의 | 김영한 - 인프런

김영한 | 멀티스레드와 동시성을 기초부터 실무 레벨까지 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다?

www.inflearn.com

 

자세한 내용은 김영한님의 고급 1편 멀티스레드와 동시성 강의를 참고하면 될 것같습니다.

 

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");
    }
}

 

실행결과

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

start() 메소드를 이용한 실행 결과입니다. 

 

실행결과를 보면 main이라는 이름의 스레드가 실행하는 것을 확인할 수 있습니다. 

 

HelloThread 스레드 객체를 생성한 다음에 start() 메서드를 호출하면 자바는 스레드를 위한 별도의 스택 공간을 할당합니다. 

 

main 스레드가 HelloThread 인스턴스를 생성하고, start() 메서드를 호출하면 Thread-0 스레드가 시작되면서 Thread-0 스레드가 run() 메서드를 호출합니다. 

 

여기서 핵심은 main 스레드가 run() 메서드를 실행하는 것이 아닌 Thread-0 스레드가 run() 메서드를 실행한다는 점이다.

main 스레드는 단지 start() 메서드를 통해 Thread-0 스레드에게 실행을 지시할 뿐이다.

 

 

*스레드 간 실행 순서는 보장하지 않는다.

스레드는 동시에 실행되기 때문에 스레드 간에 실행 순서는 얼마든지 달라질 수 있다. 

 

run()

package thread.start;

public class BadThreadMain extends Thread{

    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.run();
        System.out.println(Thread.currentThread().getName() + ": start 호출 후");

        System.out.println(Thread.currentThread().getName() + ": main() end");
    }
}

 

실행결과

main: main() start
main: start 호출 전
main: run()
main: start 호출 후
main: main() end

 

 

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

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

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

 

결과적으로 main 스레드에서 모든 것을 처리가 되는 것이다.

 

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

 

반드시 start() 메서드를 호출해야 한다

'Backend > Java' 카테고리의 다른 글

프로세스와 스레드  (0) 2024.08.29
멀티태스킹과 멀티프로세싱  (1) 2024.08.28