쓰레드의 상태
- 시작 상태(Start 상태)
- 동작할 수 있는 상태(Runnable 상태)
- 동작 상태(Run 상태) - 한 순간에 단 하나의 쓰레드만이 Run 상태가 됨.
- 대기 상태(NotRunnable 상태)
- 종료 상태(Dead 상태)
- Runnable 상태
-> 쓰레가 실행되면 일반적으로 Runnable상태가 됨.
-> Runnable 상태의 쓰레드는 여러 개 존재할 수 있음.
-> Runnable 상태에서 CPU의 제어권을 할당받는 순간 Run 상태가 되었다가, 일정 시간동안 작업을 한 후 Runnable상태로 되돌아와서 자신의 순서가 되기를 기다림. 아무리 작업이 빠르게 이루어지더라도 한 순간에 단 하나의 작업만이 Run 상태에 있을 수 있음. 그렇기 때문에 Runnable 상태는 Run으로 들어가기 전단계의 중간단계라고 말할 수 있음.
- Run상태
-> Runnable상태에서만 Run 상태가 될 수 있음.
-> 한 순간 단 하나의 쓰레드만이 Run 상태가 됨.
-> Run 상태에서는 단 하나의 작업만이 존재하지만 Runnable 상태에서는 여러 개의 쓰레드가 존재하면서 처리될 순서를 기다림. 사실 Runnable 상태를, 작업이 진행됭고 있는 상태라고 보아도 상관 없음. 오직 Runnable 상태에 있은 쓰레드만이 Run 상태가 될 수 있으며, 일정 시간동안 작업을 처리하고나면 다시 Runnable 상태가 됨. 즉, Runnable 상태에 있는 쓰레드끼리 작업을 번갈아 가면서 처리하는 방식
- Runnable과 Run의 상태 변환
-> Runnable 상태에 있는 쓰레드들끼리 번갈아 가면서 Run 상태가 됨.
-> Run 상태가 될 때 쓰레드는 작업을 진행할 수 있음.
-> Runnable 상태에서 몇 번의 Run 상태를 거친 후 모든 작업을 완료하면 Dead 상태가 됨. 메서드릐 호출이 끝나듯이 쓰레드도 끝을 맞이하는 것. 이렇게 되면 쓰레드는 자동으로 소멸하게 됨. run()의 종료는 곧 쓰레드의 종료를 의미.
- Dead 상태(쓰레드의 종료)
-> run() 메서드릐 종료는 쓰레드의 종료를 의미.
- NotRunnable 상태
-> NotRunnable 상태는 Run 상태로는 진입할 수는 없지만 Dead 상태는 아닌 대기 상태
-> 축구팀에도 1군이 있고 2군이 있음. 2군의 경우 당장은 경기를 할 수 없어도 언젠가는 경기를 할 수 있는 대기 상태에 있는 것과 비슷. 이 대기 상태를 바로 NotRunnable 상태라고 함. 이 경우에는 반드신 Runnable 상태로 진입한 후에 Run 상태가 될 수 있음.
- Start, Runnable, Run, NotRunnable, Dead 상태로 나뉘며, NotRunnable 상태를 제외하고는 대부분 자동으로 이루어짐.
NotRunnable 상태의 경우에는 프로그래머가 직접 제어. NotRunnable 상태로 만들고 싶다면 다음과 같이 sleep()을 사용.
-> Thread.sleep(5000);
-> sleep()은 Thread의 스태틱 메서드이기 때문에 어디에서나 사용 가능. sleep(5000)이 추가된 쓰레드는 5초 동안 NotRunnable 상태에 있다가 5초가 지나면 자동으로 Runnable 상태로 되돌아와 작업을 재개.
이와는 약간 다른 wait()를 사용했을 경우에는 notify()를 호출해 주기 전까지는 무한정 NotRunnable상태에 있게 됨.
만약 프로그래머가 wait()를 한 상태에서 잊어버리고 그냥 놓아 둔다면 영원히 대기상태에 빠지게 됨.
- NotRunnable 상태를 만드는 방법
-> sleep()은 일정 시간동안만 NotRunnable상태로 만듬
-> wati()와 notify()는 수동으로 NotRunnable 상태로 들어가고 나오는 것을 제어.
'프로그래밍 정리 > 자바' 카테고리의 다른 글
NotRunnable 상태 만들기 (0) | 2013.06.17 |
---|---|
쓰레드의 우선권 (0) | 2013.06.17 |
ObjectOutputStream와 ObjectInputStream : transient(객체직렬화) (0) | 2013.06.07 |
ObjectInputStream와 ObjectOutputStream (0) | 2013.06.07 |
StringReader와 StringWriter (0) | 2013.06.02 |