package thread.control;
import static util.MyLogger.log;
public class ThreadStateMain {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new MyRunnable(), "myThread");
log("myThread.state1 = " + thread.getState()); // NEW
log("myThread.start()");
thread.start();
Thread.sleep(1000); // myThread의 상태를 얻기 위함
log("myThread.state3 = " + thread.getState()); // TIMED_WAITING
Thread.sleep(4000);
log("myThread.state5 = " + thread.getState()); // TERMINATED
log("end");
}
static class MyRunnable implements Runnable {
@Override
public void run() {
try {
log("start");
log("myThread.state2 = " + Thread.currentThread().getState()); // RUNNABLE
log("sleep() start");
Thread.sleep(3000);
log("sleep() end");
log("myThread.state4 = " + Thread.currentThread().getState()); // RUNNABLE
log("end");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
Thread.currentThread() 를 호출하면 해당 코드를 실행하는 스레드 객체를 조회할 수 있다.
Thread.sleep() 해당 코드를 호출한 스레드는 `TIMED_WAITING 상태가 되면서 특정 시간 만큼 대기한다. 시간은 밀리초(ms) 단위이다. 1밀리초 = 1/1000 초, 1000밀리초 = 1초이다.
Thread.sleep()은 InterruptedException 이라는 체크 예외를 던진다. 따라서 체크 예외를 잡아서 처리하거나 던져야 한다.
run() 메서드 안에서는 체크 예외를 반드시 잡아야 한다. 이 부분은 바로 뒤에서 설명한다
InterruptedException 은 인터럽트가 걸릴 때 발생하는데, 인터럽트는 뒤에서 알아본다. 지금은 체크 예외 ` 가 발생한다 정도만 이해하면 충분하다.
state1 = NEW
- main스레드를 통해 myThread객체를 생성한다. 스레드 객체만 생성하고 아직 start() 를 호출하지 않았기 때문에 NEW 상태이다.
state2 = RUNNABLE
- myThread.start() 를 호출해서 myThread를 실행 상태로 만든다. 따라서 RUNNABLE 상태가 된다. 참고로 실행 상태가 너무 빨리 지나가기 때문에 main 스레드에서 myThread 의 상태를 확인하기는 어렵 다. 대신에 자기 자신인 myThread에서 실행 중인 자신의 상태를 확인했다
state3 = TIMED_WAITING
- Thread.sleep(3000)` : 해당 코드를 호출한 스레드는 3000ms (3초)간 대기한다. myThread가 해당 코드를 호출했으므로 3초간 대기하면서 TIMED_WAITING상태로 변한다. 참고로 이때 ` main` 스레드가 myThread` 의 TIMED_WAITING 상태를 확인하기 위해 1초간 대기하고 상 태를 확인했다.
state4 = RUNNABLE
- myThread 는 3초의 시간 대기 후 TIMED_WAITING 상태에서 빠져나와 다시 실행될 수 있는 RUNNABLE 상태로 바뀐다
state5 = TERMINATED
- myThread` 가 run()메서드를 실행 종료하고 나면 TERMINATED 상태가 된다. myThread입장에서 run()이 스택에 남은 마지막 메서드인데, run()까지 실행되고 나면 스택이 완전 히 비워진다. 이렇게 스택이 비워지면 해당 스택을 사용하는 스레드도 종료된다
Log
12:07:20.835 [ main] myThread.state1 = NEW
12:07:20.839 [ main] myThread.start()
12:07:20.839 [ myThread] start
12:07:20.840 [ myThread] myThread.state2 = RUNNABLE
12:07:20.840 [ myThread] sleep() start
12:07:21.843 [ main] myThread.state3 = TIMED_WAITING
12:07:23.844 [ myThread] sleep() end
12:07:23.845 [ myThread] myThread.state4 = RUNNABLE
12:07:23.846 [ myThread] end
12:07:25.846 [ main] myThread.state5 = TERMINATED
12:07:25.847 [ main] end
'운영체제' 카테고리의 다른 글
Thread - Join (0) | 2024.12.14 |
---|---|
체크 예외 재정의 (1) | 2024.11.29 |
Thread 생명 주기 개념편 (0) | 2024.11.29 |
스레드 생성 (0) | 2024.11.22 |
컨텍스트 스위칭 (0) | 2024.11.17 |