운영체제

Thread 생명 주기 - 코드

으엉어엉 2024. 11. 29. 12:13
728x90
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

728x90

'운영체제' 카테고리의 다른 글

Thread - Join  (0) 2024.12.14
체크 예외 재정의  (1) 2024.11.29
Thread 생명 주기 개념편  (0) 2024.11.29
스레드 생성  (0) 2024.11.22
컨텍스트 스위칭  (0) 2024.11.17