🤔 쓰레드는 어떻게 실행되는 것일까?
3개의 쓰레드가 있다면 JVM은 시간을 잘게 나누어서 한번은 쓰레드1, 또 한번은 쓰레드2를 또 한번은 쓰레드3을 실행한다. 이 속도가 워낙 빠르다 보니 마치 쓰레드 세 개가 모두 동시에 동작하는 것처럼 보이는 것이다. 이렇듯 쓰레드는 실행되었다가 멈췄다를 반복한다. 그런데 멈췄다고 해서 쓰레드가 아주 실행 중지 되는 것이 아니라 단지 실행 대기 상태인 것이다.
쓰레드를 생성하고 start()
메소드로 실행하면 쓰레드는 실행 가능한 상태인 Runnable과 실행 상태인 Running 상태를 왔다 갔다 하게된다.
누군가에게 "쓰레드를 실행하면 어떤 상태가 됩니까?" 라는 질문을 받으면
"Runnable과 Running 상태가 됩니다." 라고 답해야 한다.
yield()
메소드가 호출되면 해당 쓰레드는 다른 쓰레드에게 자원을 양보하게 된다. 즉 다른 쓰레드가 좀더 빠르게 실행되게 할 수 있다. 쓰레드가 가진 join()
메소드가 호출하면 해당 스레드가 종료될때까지 대기하게 된다.
실행되는 쓰레드 안에서 sleep()
, wait()
, suspend()
메소드가 호출되면 쓰레드는 blocked 상태가 된다. 하지만 suspend() 는 중요도가 떨어져 앞으로는 사용되지 않고 사라지게 될 메소드이니 쓰지 않는 게 좋다. 또한 스레드를 종료하게 될 목적으로 만들어진 stop() 메소드, 그리고 스레드 재개를 목적으로 한 resume() 메소드도 마찬가지이다.
sleep()
메소드는 특정 시간이지나면 자신 스스로 blocked 상태에서 빠져나와 Runnable이나 Running 상태가 된다.
오브젝트가 가지고 있는 wait()
메소드는 다른 쓰레드가 notify()
메소드나 notifyAll()
메소드를 호출하기 전까지는 Blocked 상태에서 빠져나올 수 없다. 또한 wait()
메소드는 호출되면 모니터 락을 놓게 되어 대기중인 다른 메소드가 실행되게 된다. 만약 쓰레드가 공유객체에 synchronized
블록이나 synchronized
메소드가 실행되었는데 이미 다른 쓰레드가 모니터 락을 획득한 상태라면, 락 풀에서 Blocked 상태가 되게 된다. 이 역시 보통은 Blocked 되었다고 말할 수 있다.
쓰레드의 run() 메소드가 종료되면 쓰레드 또한 중지된다. 즉 Dead 상태가 된다.