[JAVA] 고급 1편 (멀티스레드와 동시성) 3 - 스레드 생명주기와 체크 예외 재정의

호호빵·4일 전
0

1. 스레드의 생명주기

스레드의 상태

public class Thread implements Runnable {
    ...
    public enum State {
        NEW,             // 스레드가 아직 시작되지 않은 상태
        RUNNABLE,        // 스레드가 실행중이거나 실행 준비가 된 상태
        BLOCKED,         // 스레드가 동기화 락을 기다리는 상태
        WAITING,         // 스레드가 다른 스레드의 특정 작업이 완료되기를 기다리는 상태
        TIMED_WAITING,   // 일정 시간 동안 기다리는 상태
        TERMINATED;      // 스레드가 실행을 마친 상태
    }
}
  • RUNNABLE (실행상태)
    • start() 메서드가 호출되면 스레드는 이 상태로 들어감
    • CPU에서 실행될 수 있는 상태,
      운영체제 스케줄러의 실행 대기열에 있든, CPU에서 실제 실행되고 있든 모두 RUNNABLE 상태
  • BLOCKED (차단상태)
    • 다른 스레드에 의해 동기화 락을 얻기위해 기다리는 상태
      • 예) synchronized 블록에 진입하기 위해 락을 얻어야 하는 경우
        synchronized (lock) { … } 코드 블록에 진입하려고 할 때, 다른 스레드가 이미 lock을 가지고 있는 경우
  • WAITING (대기상태)
    • wait(), join() 호출 시의 상태
    • 다른 스레드가 notify(), notifyAll() 메서드를 호출하거나, join()이 완료될 때까지 기다림
    • join()을 호출하는 스레드는 대상 스레드가 TERMINATED 상태가 될 떄까지 대기 대상 스레드가 TERMINATED 상태가 되면 호출 스레드는 다시 RUNNABLE 상태가 되면서 다음 코드를 수행
  • TIMED_WAITING (시간제한 대기 상태)
    • sleep(long millis) , wait(long timeout) , join(long millis) 메서드가 호출될 때의 상태
    • 주어진 시간이 경과하거나 다른 스레드가 해당 스레드를 깨우면 이 상태에서 벗어남
      예: Thread.sleep(1000);
  • TERMINATED (종료 상태)
    • 스레드가 정상적으로 종료되거나 예외가 발생하여 종료된 경우의 상태
    • 스레드는 한 번 종료되면 다시 시작할 수 없음


자바 스레드의 상태 전이 과정

  1. [ New → Runnable ] : start() 메서드를 호출하면 스레드가 Runnable 상태로 전이된다.

  2. [ Runnable → Blocked/Waiting/Timed Waiting ] : 스레드가 락을 얻지 못하거나, wait() 또는 sleep() 메서드를 호출할 때 해당 상태로 전이된다.

  3. [ Blocked/Waiting/Timed Waiting → Runnable ] : 스레드가 락을 얻거나, 기다림이 완료되면 다시 Runnable 상태로 돌아감

  4. [ Runnable → Terminated ] : 스레드의 run() 메서드가 완료되면 스레드는 Terminated 상태가 된다.



2. 체크 예외 재정의

  • Runnable 인터페이스의 run() 메서드를 구현할 때 InterruptedException 체크 예외를 밖으로 던질 수 없음
  • Runnable 인터페이스
    public interface Runnable {
    		void run();
    }
  • 자바에서 메서드를 재정의할 때, 재정의 메서드가 지켜야할 예외와 관련된 규칙
    • 체크 예외

      • 부모 메서드가 체크 예외를 던지지 않는 경우, 재정의된 자식 메서드도 체크 예외를 던질 수 없다.
      • 자식 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.
    • 언체크 예외
      - 예외 처리를 강제하지 않으므로 상관없이 던질 수 있음

      → Runnable 인터페이스의 run() 메서드는 아무런 체크 예외를 던지지 않으므로 run() 메서드를 재정의 하는 곳에서는 체크 예외를 밖으로 던질 수 없음



Reference

자바 고급 1편 - 멀티스레드와 동시성

profile
하루에 한 개념씩

0개의 댓글