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

Java yield()方法的用法(附带实例)

Java 程序中,调用 yield() 方法可以实现线程让步,它与 sleep() 类似,也会暂停当前正在执行的线程,让当前线程让出 CPU 资源,但 yield() 方法只能让拥有相同优先级或更高优先级的线程有获取 CPU 执行的机会。如果可运行线程队列中的线程的优先级都没有当前线程的优先级高,则当前线程会继续执行。

调用 yield() 方法并不会让线程进入阻塞状态,而是让线程重新回到可运行状态,它只需要等待重新获取 CPU 资源,这一点和 sleep() 方法不一样。

【实例】在主线程中创建两个子线程对象并启动,使其并发执行,在子线程的 run() 方法中每个线程循环 9 次,每循环 3 次输出一行,通过调用 yield() 方法实现两个子线程交替输出信息。
public class ThreadYield implements Runnable {
    String str = "";

    public void run() {
        for (int i = 1; i <= 9; i++) {
            // 获取当前线程名和输出编号
            str += Thread.currentThread().getName() + "----" + i + " ";
            // 当满3条信息时,输出信息内容,并让出CPU
            if (i % 3 == 0) {
                System.out.println(str);    // 输出线程信息
                str = "";
                Thread.currentThread().yield();    // 当前线程让出CPU
            }
        }
    }

    public static void main(String[] args) {
        ThreadYield ty1 = new ThreadYield();    // 实例化ThreadYield对象
        ThreadYield ty2 = new ThreadYield();    // 实例化ThreadYield对象
        Thread threada = new Thread(ty1, "线程A"); // 通过ThreadYield对象创建线程
        Thread threadb = new Thread(ty2, "线程B"); // 通过ThreadYield对象创建线程
        threada.start();    // 启动线程threada
        threadb.start();    // 启动线程threadb
    }
}
程序运行结果为:
线程B-----1 线程B-----2 线程B-----3
线程A-----1 线程A-----2 线程A-----3
线程B-----4 线程B-----5 线程B-----6
线程A-----4 线程A-----5 线程A-----6
线程B-----7 线程B-----8 线程B-----9
线程A-----7 线程A-----8 线程A-----9
重复运行上面的程序,结果的输出顺序可能会不一样,所以通过 yield() 来控制线程的执行顺序是不可靠的,后面会介绍通过线程的同步机制来控制线程之间的执行顺序。

相关文章