Java yield()方法的用法(附带实例)
Java 程序中,调用 yield() 方法可以实现线程让步,它与 sleep() 类似,也会暂停当前正在执行的线程,让当前线程让出 CPU 资源,但 yield() 方法只能让拥有相同优先级或更高优先级的线程有获取 CPU 执行的机会。如果可运行线程队列中的线程的优先级都没有当前线程的优先级高,则当前线程会继续执行。
调用 yield() 方法并不会让线程进入阻塞状态,而是让线程重新回到可运行状态,它只需要等待重新获取 CPU 资源,这一点和 sleep() 方法不一样。
【实例】在主线程中创建两个子线程对象并启动,使其并发执行,在子线程的 run() 方法中每个线程循环 9 次,每循环 3 次输出一行,通过调用 yield() 方法实现两个子线程交替输出信息。
调用 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() 来控制线程的执行顺序是不可靠的,后面会介绍通过线程的同步机制来控制线程之间的执行顺序。