쓰레드의 실행제어
쓰레드는 동기화와 스케줄링이 어렵습니다. 우선 순위로 스케쥴링을 하는 방법이 있으나,
정교한 스케쥴링을 통해 프로세스에게 주어진 자원과 시간을 여러 쓰레드가 낭비없이
잘 사용하도록 프로그래밍 해야합니다.
쓰레드의 상태
상태 |
설명 |
NEW |
쓰레드가 생성되고 아직 start()가 호출되지 않은 상태 |
RUNNABLE |
실행 중 또는 실행 가능한 상태 |
BLOCKED |
동기화블럭에 의해서 일시정지된 상태 ( Lock이 풀릴 때까지 기다리는 상태 ) |
WAITING, TIMED_WAITING |
쓰레드의 작업이 종료되지 않았지만 실행가능하지 않은 일시정시(unrunnable) 상태 TIMED_WAITING은 일시정지시간이 지정된 경우를 의미 |
TERMINATED |
쓰레드의 작업이 종료된 상태 |
[ 쓰레드의 상태 ]
① 쓰레드를 생성하고 start()를 호출하면 바로 실행되는 것이 아니라 실행대기열에 저장되어 자신의 차례가 될 때까지 기다려야합니다. 실행대기열은 큐와 같은 구조로 먼저 실행대기열에 들어 온 쓰레드가 들어온 쓰레드가 먼저 실행됩니다.
② 실행대기상태에 있다가 자신의 차례가 되면 실행상태가 됩니다.
③ 주어진 실행시간이 다되거나 yield()를 만나면 다시 실행대기상태가 되고 다음 차례의 쓰레드가 실행상태가 됩니다.
④ 실행 중에 suspend(), sleep(), wait(), join(), I/O block에 의해 일시정지상태가 될 수 있습니다.
I/O block은 입출력작업에서 발생하는 지연상태를 말합니다. 사용자의 입력을 기다리면 경우를 예로 들 수 있는데, 이런 경우 일시정지 상태에 있다가 사용자가 입력을 마치면 다시 실행대기상태가 됩니다.
⑤ 지정된 일시정지시간이 다되거나(time-out), notify(), resume(), interrup()가 호출되면 일시정지 상태를 벗어나 다시 실행대기열에 저장되어 자신의 차례를 기다리게 됩니다.
⑥ 실행을 모두 마치거나 stop()이 호출되면 쓰레드는 소멸됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | void interrupt() : sleep()이나 join()에 의해 일시정지상태인 쓰레드를 실행대기상태로 만듭니다. 해당 쓰레드에서는 InterruptedException이 발생함으로써 일시정지상태를 벗어나게합니다. void join() void join(long millis) void join(long millis, int nanos) : 지정된 시간동안 쓰레드가 실행되도록합니다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속합니다. void resume() : suspend()에 의해 일시정지상태에 있는 쓰레드를 실행대기상태로 만듭니다. static void sleep(long millis) static void sleel(long millis, int nanos) : 지정된 시간동안 쓰레드를 일시정지시킵니다. 지정한 시간이 지나고 나면 자동적으로 다시 실행대기상태가 됩니다. void stop() : 쓰레드를 즉시 종료시킵니다. 교착상태에 빠지기 쉽기때문에 잘 사용하지 않습니다. void suspend() : 쓰레드를 일시정지시킵니다. resume()을 호출하면 다시 실행대기 상태가 됩니다. static void yield() : 실행 중에 다른 쓰레드에게 양보하고 실행대기상태가 됩니다. | cs |
[출처] [java] 쓰레드의 실행제어|작성자 Simpolor
'JAVA > JAVA 스레드' 카테고리의 다른 글
[java] wait()와 notify() (0) | 2017.11.02 |
---|---|
[java] 쓰레드의 동기화 (0) | 2017.11.02 |
[java] 데몬 쓰레드 (0) | 2017.11.01 |
[java] 쓰레드 그룹 (0) | 2017.11.01 |
[java] 쓰레드의 우선순위 (0) | 2017.11.01 |
[java] 싱글쓰레드와 멀티쓰레드 (0) | 2017.11.01 |
[java] start()와 run() (0) | 2017.11.01 |
[java] 쓰레드 구현 및 실행 (0) | 2017.11.01 |