public class Thread implements Runnable {
...
public enum State {
NEW, // 스레드가 아직 시작되지 않은 상태
RUNNABLE, // 스레드가 실행중이거나 실행 준비가 된 상태
BLOCKED, // 스레드가 동기화 락을 기다리는 상태
WAITING, // 스레드가 다른 스레드의 특정 작업이 완료되기를 기다리는 상태
TIMED_WAITING, // 일정 시간 동안 기다리는 상태
TERMINATED; // 스레드가 실행을 마친 상태
}
}
synchronized (lock) { … }
코드 블록에 진입하려고 할 때, 다른 스레드가 이미 lock을 가지고 있는 경우sleep(long millis)
, wait(long timeout)
, join(long millis)
메서드가 호출될 때의 상태Thread.sleep(1000);
자바 스레드의 상태 전이 과정
[ New → Runnable ] : start()
메서드를 호출하면 스레드가 Runnable
상태로 전이된다.
[ Runnable → Blocked/Waiting/Timed Waiting ] : 스레드가 락을 얻지 못하거나, wait()
또는 sleep()
메서드를 호출할 때 해당 상태로 전이된다.
[ Blocked/Waiting/Timed Waiting → Runnable ] : 스레드가 락을 얻거나, 기다림이 완료되면 다시 Runnable
상태로 돌아감
[ Runnable → Terminated ] : 스레드의 run()
메서드가 완료되면 스레드는 Terminated
상태가 된다.
public interface Runnable {
void run();
}
체크 예외
언체크 예외
- 예외 처리를 강제하지 않으므로 상관없이 던질 수 있음
→ Runnable 인터페이스의 run() 메서드는 아무런 체크 예외를 던지지 않으므로 run() 메서드를 재정의 하는 곳에서는 체크 예외를 밖으로 던질 수 없음
자바 고급 1편 - 멀티스레드와 동시성