-
[Java] 쓰레드(Thread) - 쓰레드의 실행제어1(스케줄링)Java 2022. 6. 14. 18:07
쓰레드 프로그래밍에서는 동기화와 스케줄링에 대해 이해해야한다.
쓰레드 스케줄링에 대해서 알기 위해서는 쓰레드 상태 관련 메서드를 알 필요가 있다.
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()에 의해 일시정지 상태인 쓰레드를 깨워서 실행되기 상태로 만든다 // 해당 쓰레드에서는 InterruptedException이 발생함으로 일시정지 상태에서 벗어난다. void stop() // 쓰레드를 즉시 종료시킨다. void suspend() // 쓰레드를 일시정지 시킨다. resume()을 호출하면 다시 실행 대기 상태가 된다. void resume() // suspend()에 의해 일시정지 상태에 있는 쓰레드를 실행대기 상태로 만든다. static void yield() // 실행중에 자신에게 주어진 실행시간을 다른 쓰레드에 양보하고 자신은 실행대기 상태가 된다.
쓰레드의 상태
- NEW : 쓰레드가 생성되고 아직 start() 가 호출되지 않은 상태
- RUNNABLE : 실행 중 또는 실행 가능한 상태
- BLOCKED : 동기화 블럭에 의해 일시정지된 상태 (lock이 풀릴 때까지 기다리는 상태)
- WAITING, TIMED_WAITING
: 쓰레드의 작업이 종료되지는 않았지만 실행 가능하지 않은 일시정지 상태
TIMED_WAITING 은 일시정지 시간이 지정된 경우를 의미한다.
- TERMINATED : 쓰레드의 작업이 종료된 상태
1. sleep(long millis) : 일정시간동안 쓰레드를 멈추게 한다.
sleep()에 의해 일시정지 상태가 된 쓰레드는 지정 시간만큼 시간이 지나거나
interrupt()가 호출되면 실행되기 상태가된다.
interrupt()의 경우 InterruptedException이 발생시켜 실행되기 상태가 되기 때문에
sleep()를 호출할 때에는 try-catch문으로 예외처리를 해줘야한다.
sleep() 메서드는 항상 현재 실행중인 쓰레드에 대해 동작한다.
2. interrupt()와 interrupted : 쓰레드의 작업을 취소한다.
intterrupt()는 쓰레드에게 작업을 멈추라고 요청하는 메서드로
쓰레드의 interrupted상태 (인스턴스 변수)를 바꾸는 것이다.
interrupted()는 쓰레드에 대해 interrupt()가 호출되어 있는지 알려준다. (true / false 반환)
또한 상태를 반환한 뒤 현재 상태를 false로 초기화 한다.
sleep(), wait(), join()에 의해 일시정지 상태에 있을 때,
interrupt()를 호출하면 InterruptedException이 발생하고
쓰레드는 실행되기 상태로 바뀐다. (실행 대기 상태로 만드는 것)
3. suspend(), resume(), stop()
suspend()는 sleep()처럼 쓰레드를 멈추게 한다.
suspend()에 의해 정지된 쓰레드는 resume()을 호출해야 다시 실행대기 상태가 된다.
stop()은 호출되는 증시 쓰레드가 종료된다.
위 3가지 메서드는 쓰레드의 실행을 제어하는 가장 손쉬운 방법이지만
suspend()와 stop()이 교착상태(deadlock)을 일으키기 쉽게 되어있기 때문에
현재 deprecated 되었다.
4. yield() : 다른 쓰레드에게 실행을 양보한다.
yield()는 쓰레드 자신에게 주어진 실행시간을 다음 차례의 쓰레드에게 양보한다.
suspend()에 의해 쓰레드의 실행이 잠시 대기하고 있는 상황이라면 (busy-waiting)
다음 차례의 쓰레드에게 실행을 양보하면서 남은 실행시간을 효율적으로 사용 가능하다.
5. join() : 다른 쓰레드의 작업을 기다린다.
쓰레드 자신이 하던 작업을 잠시 멈추고 다른 쓰레드가 지정된 시간동안 작업을
수행하도록 할 때 사용하는 메서드이다.
시간을 지정하지 않으면 다르 쓰레드가 작업을 모두 마칠 때까지 기다리게 되는데
작업 중에 다른 쓰레드의 작업이 먼저 수행되어야할 필요가 있을 때 사용한다.
sleep()와 동일한 점이 많으나 현재 쓰레드가 아닌 특정 쓰레드에 대해 동작한다는 것이 다르다.
(static 메서드가 아니다.)
[참고 : Java의 정석]
'Java' 카테고리의 다른 글
[Java] 람다 - 람다식의 타입과 형변환, java.util.function 패키지 (0) 2022.06.15 [Java] 람다 - 람다식이란?, 람다식 작성방법 (0) 2022.06.15 [Java] 쓰레드(Thread) - 쓰레드의 실행제어2(동기화) (0) 2022.06.14 [Java] 쓰레드(Thread) - 데몬 쓰레드 (daemon thread) (0) 2022.06.14 [Java] 쓰레드(Thread) - 쓰레드의 구현과 실행 (0) 2022.06.14