Java yield():设置线程让步(附带实例)
Java 的 Thread 类提供了 yield() 方法,该方法和 sleep() 方法类似,它也可以让当前正在执行的线程暂停。
sleep() 方法在暂停期间对象锁不释放从而导致线程阻塞,而 yield() 方法只是将线程的状态转化为就绪状态,等待线程调度器的再次调用,线程调度器有可能会将刚才处于就绪状态的线程重新调度出来,这就是线程让步。
接下来,通过案例来演示线程让步:
这里注意,并不是线程执行到 yield() 方法就一定切换到其他线程,也有可能线程继续执行。
调用 yield() 方法之后,可以使具有与当前线程相同优先级的线程有运行的机会。如果有其他线程与当前线程具有相同的优先级并且处于可运行状态,该方法会把调用 yield() 方法的线程放入运行池中,并允许其他线程运行。
如果没有同等优先级的线程处于可运行状态,yield() 方法什么也不做,即该线程将继续运行,实例就属于这种情况。
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
这里注意,并不是线程执行到 yield() 方法就一定切换到其他线程,也有可能线程继续执行。
调用 yield() 方法之后,可以使具有与当前线程相同优先级的线程有运行的机会。如果有其他线程与当前线程具有相同的优先级并且处于可运行状态,该方法会把调用 yield() 方法的线程放入运行池中,并允许其他线程运行。
如果没有同等优先级的线程处于可运行状态,yield() 方法什么也不做,即该线程将继续运行,实例就属于这种情况。