Language/Java

12.2 쓰레드(Thread) - 실행 제어

리져니 2021. 7. 28. 20:56

효율적인 멀티쓰레드 프로그램을 만들기 위해서는 정교한 스케줄링을 통해 프로세스에게 주어진 자원과 시간을 여러 쓰레드가 낭비없이 잘 사용하도록 프로그래밍 해야한다.

스케줄링을 잘하기 위해서는 쓰레드의 상태와 관련 메서드를 잘 알아야 한다.

static void sleep(long millis)
static void sleep(long millis, int nanos)
지정된 시간동안 쓰레드를 일시정지 시킨다.
지정한 시간이 지나면 자동적으로 다시 실행 대기상태가 된다
void join()
void join(long millis)
void join(long millis, int nanos)
지정된 시간동안 쓰레드가 실행되도록 한다.
지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속한다
void interrupt() sleep()이나 join()에 의해 일시정지 상태인 쓰레드를 깨워서 실행 대기상태로 만든다.
해당 쓰레드에서는 interruptException이 발생함으로써 일시정지 상태를 벗어나게 된다.
void stop() 쓰레드를 즉시 종료시킨다.
void suspend() 쓰레드를 일시 정지시킨다. resume()을 호출하면 다시 실행대기 상태가 된다.
void resume() suspend()에 의해 일시정지 상태에 있는 쓰레드를 실행대기 상태로 만든다.
static void yield() 실행 중에 자신에게 주어진 실행 시간을 다른 쓰레드에게 양보하고 자신은 실행대기 상태가 된다.

 

쓰레드의 상태에 대해 알아보자

쓰레드의 상태

NEW 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED 동기화블럭에 의해 일시정지된 상태(lock이 풀릴때까지 기다리는 상태)
WAITING
TIMED_WAITING
쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일시정지 상태.
TIMED_WAITING은 일시정지 시간이 지정된 경우를 의미
TERMINATED 쓰레드의 작업이 종료된 상태

1. 쓰레드를 생성하고 start()를 호출하려면 바로 실행되는 것이 아니라 대기열에 저장되어 차례가 될때까지 기다린다.

(실행 대기열은 큐와 같은 구조로 먼저 들어온 쓰레드가 먼저 실행됨)

2. 실행대기 상태에 있다가 차례가 되면 실행상태가 된다.

3. 주어진 실행시간이 다되거나 yield()를 만나면 다시 실행대기 상태가 되고, 다음 차레의 쓰레드가 실행상태가 된다.

4. 실행중에 suspend(), sleep(), wait(), join(), I/O Block(입출력 작업시 발생하는 지연상태)에 의해 일시정지 상태가 될수 있다. 사용자가 입력을 마치면 다시 실행대기 상태가 된다.

5. 지정된 일시정지 시간이 다되거나,  notify(), resume(), interrupt()가 호출되면 일시정지 상태를 벗어나 다시 실행대기열에 저장되어 자신의 차례를 기다린다.

6. 실행을 모두 마치거나 stop()이 호출되면 쓰레드는 소멸된다.

728x90