ch 13-26,27 suspend(), resume()
suspend(), resume(), stop()
- 쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.
void suspend() 쓰레드를 일시정지 시킨다.
void resume() suspend()에 의해 일시정지된 쓰레드를 실행대기상태로 만든다.
void stop() 쓰레드를 즉시 종료시킨다.
- suspend(), resume(), stop()은 교착상태에 빠지기 쉬워서 deprecated되었다.
- 그래서 쓰레드 클래스에 정의된 suspend(), resume(), stop()을 사용하지 않고 직접 작성해서 사용한다.
ch 13-28,29 join(), yield()
join()
- 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.
void join() // 작업이 모두 끝날 때까지
void join(long millis) // 천분의 일초 동안
void join(long millis, in nanos) // 천분의 일초 + 나노초 동안
- 예외처리를 해야 한다.(InterruptedException)이 발생하면 작업 재개
join() - 예시
- GC (가비지 컬렉터)와 비슷 / 데몬쓰레드로 돌아간다.
- 10초마다 gc(사용하지 않는 객체를 제거한다.)
- 메모리가 부족한 경우, 쓰레드를 깨운다.
- 그런데, 1 메모리가 부족한 경우, 2. 메모리를 사용하는 과정에서
- join이 필요하다. (메모리 사용 전에 gc가 메모리를 정리할 시간을 주기 위해)
yeild()
- 남은 시간을 다음 쓰레드에게 양보하고, 자신(현재 쓰레드)은 실행대기한다.
- static 메서드로 현재 쓰레드에서만 사용 가능
- 주어진 시간을 다 사용하지 않고 다른 실행대기 중인 쓰레드에게 양보한다.
- yield()와 interrupt()를 적절히 사용하면, 응답성과 효율을 높일 수 있다.
- if문이 false고 while문이 true인 경우에 if문은 일시정지가 되어 주어진 시간동안 할 일이 없다. 그럴 때, while문이 true에게 시간을 양보한다.
- else를 활용하여 yeild()를 사용한다.
- interrupt()를 사용하면 시간을 기다리지 않고 깨울 수 있다.
- yeild()는 OS에게 스케줄러를 통보하는 것으로 무조건 실행되지는 않는다.