Java/자바 정리

132. 스레드 양보하기 – Thread.yield() 활용

코딩하는냥이 2025. 5. 19. 12:16
반응형

이번 글에서는 Thread.yield()를 사용하여
스레드가 스스로 실행을 양보하는 방식을 실습합니다.
두 개의 작업 스레드 중 하나가 일시적으로 작업을 중지하고,
다른 스레드에게 CPU를 넘기는 방식을 구현해 봅니다.


📌 예제 코드

✅ WorkThread.java

package ch14.sec05;

public class WorkThread extends Thread {
    public boolean work = true;  // 작업 수행 여부

    public WorkThread(String name) {
        setName(name);  // 스레드 이름 설정
    }

    public void run() {
        while (true) {
            if (work)
                System.out.println(getName() + ": 작업처리");
            else
                Thread.yield();  // 작업 중단, 다른 스레드에게 양보
        }
    }
}

✅ YieldExample.java

package ch14.sec05;

public class YieldExample {
    public static void main(String[] args) {
        WorkThread workThreadA = new WorkThread("workThreadA");
        WorkThread workThreadB = new WorkThread("workThreadB");

        workThreadA.start();
        workThreadB.start();

        try {
            Thread.sleep(5000);  // 5초 동안 둘 다 작업 수행
        } catch (Exception e) {}

        workThreadA.work = false;  // A 스레드 일시 중지 (양보)

        try {
            Thread.sleep(10000);  // 10초간 B만 작업 수행
        } catch (Exception e) {}

        workThreadA.work = true;  // A 작업 재개
    }
}

💻 실행 결과 예시

workThreadA: 작업처리
workThreadB: 작업처리
...
workThreadB: 작업처리
...
(5초 후 A는 조용해지고 B만 출력)
...
(10초 후 A도 다시 작업처리 시작)

💡 실행 결과는 매번 다를 수 있지만, workThreadA가 5초 후 조용해지고, 이후 다시 나타나는 흐름이 반복됨


💬 코드 설명

  • workThreadA와 workThreadB는 무한 루프에서 "작업처리"를 출력
  • Thread.yield()는 자발적으로 CPU를 양보하여 다른 스레드에게 실행 기회를 넘김
  • work 플래그를 통해 스레드의 실행 여부를 동적으로 제어
  • Thread.sleep()은 일정 시간 대기 후 스레드 상태를 바꾸는 데 사용됨

💡 Thread.yield()란?

항목 설명
기능 현재 스레드가 실행을 자발적으로 양보함
효과 다른 동등 우선순위 스레드가 먼저 실행될 수 있도록 기회 제공
주의 반드시 양보된다는 보장 없음 (OS 스케줄러에 따라 다름)
활용 UI 대기, 게임 루프, 작업 흐름 제어 등에서 CPU 점유 최소화를 원할 때

📌 정리하자면, Thread.yield()는 현재 스레드가 실행 중임에도 다른 스레드에게 자리를 양보하고 싶을 때 사용하는 메서드입니다.
이번 예제처럼 work 플래그를 통해 제어하면 스레드가 자발적으로 대기와 실행을 오가며 동작을 조절할 수 있고,
이를 통해 CPU 점유를 줄이고 효율적인 다중 작업 흐름을 만들 수 있습니다.