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 점유를 줄이고 효율적인 다중 작업 흐름을 만들 수 있습니다.