본문 바로가기

자바의 정석 정리

자바의 정석 - 13.3 start()와 run()

13.3.1 run()호출

  • main메서드에서 run()을 호출하는 것은 쓰레드를 실행하는 것이 아니라 단순히 클래스에 선언된 메서드를 호출하는 것일 뿐
run
----------
main

13.3.2 start() 호출

  • 쓰레드가 작업에 필요한 호출스택(call stack)을 생성한 다음 run()을 호출
  • 호출 스택에 run()이 첫 번째로 올라가게 한다.
1) main메서드에서 start()호출
start
----------
main 

2) start()는 새로운 쓰레드를 생성하고, 쓰레드가 작업하는데 사용될 호출스택 생성
start       |
----------  |
main        |

3) 새로 생성된 호출스택에 run()이 호출되어, 쓰레드가 독립된 공간에서 작업 수행
start       |
----------  |----------
main        | run

4)이제는 호출스택이 2개이므로 스케줄러가 정한 순서에 의해서 번갈아 가면서 수행
            |
----------  |----------
main        | run

13.3.3 main 쓰레드

  • 프로그램 실행시 기본적으로 실행되는 하나의 쓰레드
  • 기본적으로 생성되는 하나의 쓰레드가 main()호출
  • 실행중인 사용자 쓰레드가 하나도 없을 때 프로그램 종료
run
class A {
    public static void main(String[] args) throws Exception{
        ThreadEx1 t1 = new ThreadEx1();
        t1.start()
    }
}

class ThreadEx1 extends Thread{
    public void run(){
        throwException();
    }
    public void throwException(){
        try{
            throw new Exception();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

throwException
----------
run
class B {
    public static void main(String[] args) throws Exception{
        ThreadEx2 t2 = new ThreadEx2();
        t2.run();
    }
}

class ThreadEx2 extends Thread{
    public void run(){
        throwException();
    }
    public void throwException(){
        try{
            throw new Exception();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

throwException
----------
run
----------
main