Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Thread 클래스의 yield() 메소드 완벽 이해하기

Java의 yield() 메소드는 Thread 클래스에 속한 정적(static) 메소드입니다. 이 메소드는 현재 실행 중인 스레드를 일시 중단하고, 동일한 우선순위를 가진 대기 중인 다른 스레드들에게 실행 기회를 양보하는 역할을 합니다.

만약 대기 중인 스레드가 없거나, 모든 대기 스레드의 우선순위가 낮다면, 현재 스레드는 계속해서 자신의 작업을 수행하게 됩니다. 즉, yield() 호출이 반드시 다른 스레드로 전환되는 것을 보장하지는 않습니다.

yield() 메소드의 주요 장점은 현재 스레드의 실행 시간이 길어질 때, 프로세서를 다른 대기 스레드에게 할당하여 전체적인 멀티스레딩 효율을 높일 수 있다는 점입니다.

문법(Syntax)

public static void yield()

예제 코드(Example)

class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 5; ++i) {
            // yield()를 호출하면 MyThread의 실행이 잠시 중단되고
            // main 스레드에게 실행 기회가 넘어갑니다.
            Thread.yield();
            System.out.println("Thread started:" + Thread.currentThread().getName());
        }
        System.out.println("Thread ended:" + Thread.currentThread().getName());
    }
}
public class YieldMethodTest {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        for (int i = 0; i < 5; ++i) {
            System.out.println("Thread started:" + Thread.currentThread().getName());
        }
        System.out.println("Thread ended:" + Thread.currentThread().getName());
    }
}

실행 결과(Output)

Thread started:main
Thread started:Thread-0
Thread started:main
Thread started:Thread-0
Thread started:main
Thread started:Thread-0
Thread started:main
Thread started:Thread-0
Thread started:main
Thread started:Thread-0
Thread ended:main
Thread ended:Thread-0

참고 사항

위 실행 결과에서 볼 수 있듯이, MyThread(Thread-0)에서 yield()를 호출할 때마다 main 스레드와 번갈아 가며 실행되는 것을 확인할 수 있습니다. 다만 yield()의 동작은 운영체제의 스레드 스케줄러에 따라 달라질 수 있으므로, 실행 결과는 환경마다 다르게 나타날 수 있다는 점을 유의해야 합니다. 또한 yield()는 스레드 간의 동기화나 정확한 실행 순서 보장을 위한 목적으로 사용해서는 안 되며, 어디까지나 스케줄러에게 힌트를 제공하는 용도로만 활용하는 것이 바람직합니다.