首页 > 编程笔记 > Java笔记 阅读:18

Java yield():设置线程让步(附带实例)

Java 的 Thread 类提供了 yield() 方法,该方法和 sleep() 方法类似,它也可以让当前正在执行的线程暂停。

sleep() 方法在暂停期间对象锁不释放从而导致线程阻塞,而 yield() 方法只是将线程的状态转化为就绪状态,等待线程调度器的再次调用,线程调度器有可能会将刚才处于就绪状态的线程重新调度出来,这就是线程让步。

接下来,通过案例来演示线程让步:
public class Demo {
    public static void main(String[] args) throws InterruptedException {
        // 创建MyThread实例
        System.out.println("吃饭时吃菜的顺序:");
        MyThread myThread1 = new MyThread("水煮肉片");
        MyThread myThread2 = new MyThread("酱焖茼蒿");
        myThread1.setPriority(Thread.MAX_PRIORITY); // 设置优先级
        myThread2.setPriority(Thread.MIN_PRIORITY);
        myThread1.start();
        myThread2.start();
    }
}

class MyThread extends Thread {
    private final String Cuisine;

    public MyThread(String Cuisine) {
        this.Cuisine = Cuisine;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            Thread.yield(); // 设置线程让步
            System.out.println(Cuisine + i);
        }
    }
}
程序的运行结果如下:

吃饭时吃菜的顺序:
水煮肉片0
酱焖茼蒿0
水煮肉片1
酱焖茼蒿1
水煮肉片2
酱焖茼蒿2
酱焖茼蒿3
酱焖茼蒿4
水煮肉片3
水煮肉片4

程序中声明了 MyThread 类,继承 Thread 类并实现了 run() 方法,方法内循环打印结果,每次打印前调用 yield() 方法进行线程让步。Demo 类在 main() 方法中创建 MyThread 类实例,分别创建并开启两个线程。

这里注意,并不是线程执行到 yield() 方法就一定切换到其他线程,也有可能线程继续执行。

调用 yield() 方法之后,可以使具有与当前线程相同优先级的线程有运行的机会。如果有其他线程与当前线程具有相同的优先级并且处于可运行状态,该方法会把调用 yield() 方法的线程放入运行池中,并允许其他线程运行。

如果没有同等优先级的线程处于可运行状态,yield() 方法什么也不做,即该线程将继续运行,实例就属于这种情况。

相关文章