Java 쓰레드 상태
(http://ospace.tistory.com/(ospace114@empal.com)) 2008.07.24
주의: 가져가실때에는 출처를 명시해주세요.
아래 내용은 자바 쓰레드 상태 Greek Explains에 08년 7월 3일에 올라온 내용이다. 내용은 간략하지만 나름 대로 괜찮은 내용이라서 번역해서 정리해 올려봅니다.
자바에서 쓰레드 상태는 자바의 Thread내 State라는 static nated class 형태로 enumeration 형으로 정의되어 있다. 그래서 "Thread.State.NEW"형식으로 상태를 참조할 수 있다. 주의 할 것은 이 곳의 상태목록과 실제 운영체제의 상태목록과는 틀리다.
상태는 아래와 같이 총 6가지가 있다.
- NEW: 새로운 쓰레드로 아직 시작되지 않음
- RUNNABLE: JVM이 동작중. 이는 항상 동장하고 있다는 것은 아님. 리소스 획득을 위해서 잠시 대기 중일 수 있다.
- BLOCKED: 쓰레드가 synchronized block 혹은 method에 진입하기 위해 대기.
- WAITING: 대기 상태로 다른 쓰레드가 작업 중임을 의미. 이는 Object.wait 메소드 호출 후에도 진입되는 상태
- TIMED_WAITING: 쓰레드가 특정 시간을 대기함을의미. 이는 Thread.sleep(), Object.wait()로 시간 인자가 들어간 메소드가 호출될때 진입되는 상태. 혹은 LockSupport, ParkNanos, LockSupport, ParkUntil 메소드도 동일
- TERMINATED: run 메소드에서 빠져나온 경우 또는 예외가 발생하여 빠져나온 경우
BLOCK과 WAITING/TIMED-WAITING 상태 간의 차이점은?
쓰레드가 Object.wait를 호출하면 모든 획득된 monitor을 해제하고 WAITING/TIMED-WAITING 상태로 진입한다. 해당 객체에 다시 notify나 notifyAll을 호출하게 되면 WAITING/TIMED-WAITING상태에서 잃어버린 모든 monitor을 획득하려고 시도한다. 몇몇 다른 쓰레드가 동시에 같은 monitor을 획득하려한다고 하자. 한 쓰레드가 monitor을 획득하면 다른 쓰레드는 BLOCK상태로 된다. 해당 monitor을 해제하면 다른 BLOCK된 쓰레드가 monitor를 획득하고 실행된다.
잘못된 동기화로 인해서 이렇게 BLOCK되는 쓰레드가 많이 생기고 전체 효율이 떨어지며 최악의 경우 데드락이 발생할 수 있다.
WAITING과 TIME-WAITING 상태간의 차이점은?
쓰레드가 TIME-WAITING 상태에 있다면 일정 시간이 지난후에서 다시 실행상태로 된다. 앞의 설명과 같이 잃어버린 monitor를 획득한다.
WAITING은 영원히 대기하며 쓰레드를 깨우기 전까지 실행되지 않은다. Thread.join 메소드는 WAITING 상태로 들어가면 특정 쓰레드가 종료할 때까지 대기하게 된다.
이상으로 글을 마치겠다. 참고로 Thread 클래스에는 쓰레드 관리위한 많은 메소드가 있다. 그러나 Runnable 인터페이스는 run 메소드만 있다. Runnable 인터페이스는 Thread 클래스에 의해서 동작하기 위한 몸체를 가지고 있다고 보면 된다.
쓰레드 사용은 조심해야되며 잘못 사용했을 경우 프로그램이 멈춰버린다.
정말 잡기 힘든 문제이다. 특히 상황을 더욱 악화시키는 것은 쓰레드에 대해서 대충 개념적으로 알고 자바 쓰레드에 대해서는 정확히 모르고 프로그램을 작성하는게 아닌가 생각한다. 이는 본인도 경험했던 부분이다.
앞의 내용이 자바 쓰레드에 지식에 조금이나마 도움이 되었으면 한다.
ospace 080724
출처:
http://geekexplains.blogspot.com/2008/07/threadstate-in-java-blocked-vs-waiting.html
'3.구현 > Java or Kotlin' 카테고리의 다른 글
JSP 간단하게 시작하기... (0) | 2008.12.05 |
---|---|
Java 쓰레드 간단한 코드 예제 (0) | 2008.07.24 |
Jar 패키징(Packaging) (0) | 2008.07.21 |
Reactor 패턴의 예제 코드 (0) | 2008.07.17 |
SLF4J simple tutorial (0) | 2007.12.20 |