본 포스팅은 [이것이 자바다]의 내용을 참고하여 작성하였습니다.
12.6.1 주어진 시간동안 일시 정지: sleep()
실행중인 스레드를 일정 시간 멈추게 하고 싶다면 Thread 클래스의 정적 메소드인 sleep()을 사용하면 된다.
다음과 같이 Thread.sleep() 메소드를 호출한 스레드는 주어진 시간 동안 일시 정지 상태가 되고, 다시 실행 대기 상태로 돌아간다.
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
// interrupt() 메소드가 호출되면 실행
}
매개값으로는 얼마 동안 일시 정지 상태로 있을 것인지, ms 단위로 시간을 주면 된다.
주어진 시간이 되기 전에 interrupt() 메소드가 호출되면 InterruptedException이 발생하기 때문에 예외 처리가 필요하다.
12.6.2 다른 스레드에게 실행 양보: yield()
스레드가 처리하는 작업은 반복적인 실행을 위해 for문이나 while문을 포함하는 경우가 많다.
가끔은 이러한 반복문들이 무의미한 반복을 하는 경우가 있다. 다음 코드로 예시를 들어보자.
public void run() {
while(true) {
if(work) {
System.out.println("Thread A 작업 내용");
}
}
}
스레드가 시작되어 run() 메소드를 실행하면 while(true){ } 블록을 무한 반복 실행한다. 만약 work의 값이 false이고 그 값이 true로 변경되는 시점이 불명확하다면, while문은 어떠한 실행문도 실행하지 않으면서 무의미한 반복을 한다.
이것보다는 다른 스레드에게 실행을 양보하고 자신은 실행 대기 상태로 가는 것이 전체 프로그램 성능에 도움이 된다.
이런 기능을 위해서 스레드는 yield() 메소드를 제공하고 있다. yield() 메소드를 호출한 스레드는 실행 대기 상태로 돌아가고 동일한 우선순위 또는 높은 우선순위를 갖는 다른 스레드가 실행 기회를 가질 수 있도록 해준다.
다음 코드는 의미 없는 반복을 줄이기 위해 yield() 메소드를 호출해서 다른 스레드에게 실행 기회를 주도록 수정한 것이다.
public void run() {
while(true) {
if(work) {
System.out.println("Thread A 작업 내용");
} else {
Thread.yield(); // work가 false가 되면 다른 스레드에게 실행 양보
}
}
}
'Study in SSAFY > 이것이 자바다' 카테고리의 다른 글
[이것이 자바다] 16.11 스트림과 병렬처리 - 수집(collect()) (0) | 2022.09.14 |
---|---|
[이것이 자바다] 12.5 멀티스레드 - 스레드 상태 (0) | 2022.09.12 |
[이것이 자바다] 12.4 멀티스레드 - 동기화 메소드와 동기화 블록 (0) | 2022.09.12 |
[이것이 자바다] 11. 기본 API 클래스(Math~Formatting) (0) | 2022.08.10 |
[이것이 자바다] 10. 예외 처리 (0) | 2022.07.31 |