yield() 함수란 무엇인가?
자바에서 yield() 함수는 현재 실행 중인 스레드가 프로세서를 자발적으로 양보하도록 힌트를 주는 역할을 합니다. 즉, 상대적으로 덜 중요하거나 오랜 시간 점유하고 있는 스레드보다 더 중요한 스레드가 먼저 실행될 수 있도록 유도하는 것입니다.
스레드가 java.lang.Thread.yield() 메소드를 호출하면, 이는 스레드 스케줄러에게 "현재 스레드의 실행을 잠시 멈춰도 된다"는 신호를 보내는 것입니다. 다만 스케줄러는 이 신호를 받아들일 수도 있고, 무시할 수도 있습니다.
스레드가 yield()를 호출하면 스케줄러는 같은 우선순위 또는 그보다 높은 우선순위를 가진 다른 스레드가 존재하는지 확인합니다. 만약 그런 스레드가 있다면, 현재 스레드는 실행(Running) 상태에서 대기 가능(Runnable/Ready) 상태로 전환되고, 해당 스레드에 프로세서 자원이 할당됩니다.
yield() 메소드의 문법
public static native void yield()
예제 코드
import java.lang.*;
class Demo extends Thread{
public void run(){
for (int i=0; i<3 ; i++)
System.out.println("In control of " + Thread.currentThread().getName() + " thread");
}
}
public class Demo_one{
public static void main(String[]args){
Demo my_obj = new Demo();
my_obj.start();
for (int i=0; i<3; i++){
Thread.yield();
System.out.println("In control of " + Thread.currentThread().getName() + " thread");
}
}
}
실행 결과
In control of main thread In control of main thread In control of main thread In control of Thread-0 thread In control of Thread-0 thread In control of Thread-0 thread
코드 설명
Demo 클래스는 Thread 클래스를 상속받습니다. 이 클래스 내부에는 run() 메소드가 정의되어 있으며, 반복문을 통해 여러 번 출력을 수행하고 getName() 함수로 현재 스레드의 이름을 가져옵니다.
Demo_one 클래스의 main 메소드에서는 Demo 객체를 생성한 뒤 start() 함수를 호출하여 스레드를 시작합니다. 메인 스레드 역시 반복문 안에서 Thread.yield()를 호출하여 실행 기회를 다른 스레드에게 양보합니다.
실행 결과를 보면, 메인 스레드가 yield()를 호출했기 때문에 Thread-0 스레드가 먼저 실행 기회를 얻어 세 번 모두 출력된 후, 메인 스레드가 나머지 출력을 마무리하는 것을 확인할 수 있습니다.
yield() 사용 시 알아두어야 할 핵심 사항
실행 순서 보장 없음: 스레드가
yield()를 통해 실행을 마친 후에는 여러 스레드가 프로세서 자원을 두고 경쟁하게 되며, 어떤 스레드가 먼저 실행될지 지정할 방법이 없습니다.상태 전환: 스레드가
yield()메소드를 실행하면 Running(실행) 상태에서 Runnable(대기 가능) 상태로 전환됩니다.선점형 스케줄링 필요:
yield()메소드는 플랫폼이 선점형(pre-emptive) 스케줄링을 지원하는 경우에만 의미 있게 사용할 수 있습니다.재실행 시점 미보장: 스레드가 실행 도중 일시 정지되더라도 곧바로 또는 나중에라도 다시 실행 기회를 얻는다는 보장은 없습니다. 모든 것은 스케줄링 알고리즘과 스레드 스케줄러의 판단에 따라 결정됩니다.