Thread.yield()
方法是一个静态方法,用于提醒调度器当前线程愿意放弃 CPU 资源,让其他具有相同或更高优先级的线程有机会执行。调用 yield()
方法并不保证当前线程会立即停止执行,而只是表示当前线程愿意让出一部分执行时间。
yield()
方法的作用是告诉调度器当前线程的执行优先级较低,可以暂时让其他优先级较高的线程先执行。调用 yield()
方法后,当前线程会进入就绪状态,等待调度器重新选择执行线程。
需要注意以下几点关于 yield()
方法的特性:
yield()
方法并不会将当前线程阻塞,它只是让出一部分执行时间给其他线程,因此当前线程仍然处于可运行状态,可能会继续执行。yield()
方法不会释放当前线程持有的锁,因此其他线程仍然无法获取该锁进行执行。yield()
方法的效果依赖于操作系统和 JVM 的实现,不同的平台可能会有不同的行为。yield()
方法的使用需要谨慎,过度使用yield()
可能导致线程间频繁切换,降低系统的整体性能。
下面是一个简单的示例来说明 yield()
方法的使用:
public class YieldExample {
public static void main(String[] args) {
Thread thread1 = new Thread(new MyRunnable(), "Thread 1");
Thread thread2 = new Thread(new MyRunnable(), "Thread 2");
thread1.start();
thread2.start();
}
static class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
// 当 i 等于 3 时,调用 yield() 方法让出 CPU 执行权
if (i == 3) {
Thread.yield();
}
}
}
}
}
在上述示例中,我们创建了两个线程并启动它们。每个线程都会执行相同的任务,即打印从 0 到 4 的数字。当线程执行到数字 3 时,调用 yield()
方法让出 CPU 执行权。你会注意到在输出中,线程可能会交替执行,因为它们通过 yield()
方法主动放弃了一部分执行时间给其他线程。
需要注意的是,yield()
方法不能保证线程切换的顺序或频率。具体的线程调度行为取决于操作系统和 JVM 的实现,因此结果可能因系统的不同而有所差异。
总而言之,Thread.yield()
方法是一种提示调度器的方式,告诉它当前线程愿意让出一部分执行时间给
其他线程。然而,它并不是实现线程间协作的主要手段,更多地被用于测试和调试的目的。在大多数情况下,使用更高级的并发工具(如锁、信号量、条件变量等)更为可靠和灵活。