start()와 run()
public class ThreadEx {
public static void main(String[] args) {
ThreadEx1_1 th1 = new ThreadEx1_1();
th1.start();
Runnable r = new ThreadEx1_1();
Thread th2 = new Thread(r);
th2.start();
}
}
왜 run()이 아닌 start()로 Thread를 실행시켰을까?
run() - 단순히 클래스에 선언되어 있는 메서드를 호출할 뿐이다.
start()
Thread가 작업을 실행하는데 필요한 호출 스택을 생성한 다음 run()을 호출
- 해당 run은 호출 스택의 첫 번째로 올라간다.
모든 Thread는 저마다의 독립적인 작업을 수행하기 때문에 자신만의 호출 스택이 필요하다.
Thread를 생성하고 실행할 때마다 새로운 호출 스택이 생성되고 Thread가 종료되면 해당 호출 스택은 사라진다.
1. main 메서드에서 Thread의 start() 호출
2. start는 새로운 Thread 생성 및 작업에 필요한 호출 스택을 생성
3. 새로 생성된 호출 스택에 run()이 호출되어, Thread가 독립적인 공간에서 작업을 수행
4. 운영체제가 정의한 스케줄러의 순서에 따라 두 개의 호출 스택은 번갈아 가면서 실행된다.
호출 스택의 가장 위에 있는 메서드가 현재 실행 중인 메서드이고 이때 다른 메서드들은 대기상태이지만 호출 스택이 여러 개인 경우에는 아무리 가장 위에 있는 메서드라 할지라도 대기상태일 수 있다.
main 쓰레드
우리가 아주 익숙하게 사용하는 main() 메서드의 작업을 수행하는 것은 main Thread이다.
하지만 위와 같이 main 메서드의 작업이 종료되었다고 해서 프로그램이 종료될까?
아니다! 다른 쓰레드가 아직 작업을 마치지 않은 상태라면 프로그램은 종료되지 않는다.
생성된 Thread에 예외를 발생시키고 예외가 발생한 당시의 호출 스택을 출력
class ThreadEx1_1 extends Thread{
@Override
public void run() {
ThrowException();
}
public void ThrowException () {
try {
throw new Exception();
}catch (Exception e) {
e.printStackTrace();
}
}
}
여기서 main Thread는 어디 갔을까?
main 스레드는 예외 발생으로 인해서 강제 종료되었고
그 이후에 Thread인 run의 호출 스택이 실행된다.
이것이 의미하는 바는 한 개의 Thread의 종료는 다른 Thread에 영향을 미치지 않는다는 점이다.
Thread를 생성하지 않고 단지 호출하였을 때
public class ThreadEx {
public static void main(String[] args) {
ThreadEx1_1 th1 = new ThreadEx1_1();
th1.run();
}
}
실행하지않고 호출하였을 땐 main 메소드가 포함되어있다.
코드 참조
https://github.com/mike6321/PURE_JAVA/tree/master/Thread
'Java > Java' 카테고리의 다른 글
(JAVA) 쓰레드 우선순위 (0) | 2020.01.21 |
---|---|
(JAVA) 싱글쓰레드와 멀티쓰레드 (0) | 2020.01.20 |
(JAVA) 쓰레드의 개요 (1) (0) | 2020.01.19 |
(JAVA) 애노테이션 프로세서 (0) | 2019.12.28 |
(JAVA) 클래스의 프록시 생성 (0) | 2019.12.24 |