티스토리 뷰
yield() 메서드란?
yield() 메서드는 현재 실행 중인 스레드가 CPU를 양보하여 다른 스레드가 실행될 수 있도록 하는 메서드이다. 메서드를 호출한 스레드는 RUNNABLE 상태를 유지하면서 CPU를 양보하기 때문에 만약 양보할 스레드가 없다면 스레드가 다시 실행될 수 있다.
yield() 예제
public class YieldMethod {
public static void main(String[] args) throws InterruptedException {
Printer printer = new Printer();
Thread printerThread = new Thread(printer, "printer");
printerThread.start();
Scanner userInput = new Scanner(System.in);
while (true) {
System.out.println("프린터할 문서를 입력하세요. 종료 (q): ");
String input = userInput.nextLine();
if (input.equals("q")) {
printerThread.interrupt();
break;
}
printer.addJob(input);
}
}
static class Printer implements Runnable {
Queue<String> jobQueue = new ConcurrentLinkedQueue<>();
@Override
public void run() {
while (!Thread.interrupted()) {
if (jobQueue.isEmpty()) {
Thread.yield(); //추가
continue;
}
try {
String job = jobQueue.poll();
log("출력 시작: " + job + ", 대기 문서: " + jobQueue);
Thread.sleep(3000); //출력에 걸리는 시간
log("출력 완료: " + job);
} catch (InterruptedException e) {
log("인터럽트!");
break;
}
}
log("프린터 종료");
}
public void addJob(String input) {
jobQueue.offer(input);
}
}
}
위의 예제 코드는 콘솔에 입력하는 main 스레드와 출력을 담당하는 print 스레드가 있다. 콘솔에 q를 입력하면 print 스레드에 인터럽트를 발생시켜 해당 스레드를 종료한다. 그 외에 다른 값을 입력하면 큐에 쌓고 print 스레드는 큐에 있는 값을 3초마다 출력한다.
실행 결과
프린터할 문서를 입력하세요. 종료 (q):
1
프린터할 문서를 입력하세요. 종료 (q):
21:25:18.740 [ printer] 출력 시작: 1, 대기 문서: []
2
프린터할 문서를 입력하세요. 종료 (q):
3
프린터할 문서를 입력하세요. 종료 (q):
4
프린터할 문서를 입력하세요. 종료 (q):
5
프린터할 문서를 입력하세요. 종료 (q):
21:25:21.754 [ printer] 출력 완료: 1
21:25:21.754 [ printer] 출력 시작: 2, 대기 문서: [3, 4, 5]
21:25:24.759 [ printer] 출력 완료: 2
21:25:24.759 [ printer] 출력 시작: 3, 대기 문서: [4, 5]
q
21:25:25.727 [ printer] 인터럽트!
21:25:25.727 [ printer] 프린터 종료
yield() 를 사용하는 이유?
위의 예제에서 yield() 를 사용하는 이유는 print 스레드에서 인터럽트의 상태를 체크하고 큐의 상태를 확인하는데 문제는 쉴 틈 없이 CPU에서 이 로직이 반복된다는 것이다. 문제는 1초에 while문을 수억 번 반복할 수도 있다. 결과적으로 CPU 자원을 많이 사용하는데 이런 체크 로직에 CPU 자원을 많이 사용하면 정작 필요한 스레드의 효율이 떨어질 수 있다. 차라리 yield() 를 호출해서 다른 스레드에 작업을 양보하는게 더 효율적이다.
정리
yield() 메서드는 메서드를 호출하는 스레드가 다른 스레드에게 CPU 자원을 양보하는 메서드이다. 주로 반복문 안에 yield() 메서드를 호출하여 불필요한 반복문을 호출하지 않게 하고 필요한 다른 스레드의 CPU 자원을 양보한다.
본 포스팅은 “김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성/인프런”를 학습한 내용을 정리한 것
'Java > Java' 카테고리의 다른 글
| <Java> 원자적 연산이란? (5) | 2025.08.09 |
|---|---|
| <Java> 버퍼 이란? (0) | 2025.03.04 |
| <Java> Object 객체의 wait(), notify(), notifyAll() 메서드란? (1) | 2025.01.25 |
| <Java> ReentrantLock이란? (0) | 2024.10.26 |
| <Java> sychronized이란? (1) | 2024.10.22 |
