티스토리 뷰

Java/Java

<Java> yield() 메서드란?

면목동인간 2025. 5. 10. 21:54

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
댓글
최근에 올라온 글
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함
Total
Today
Yesterday