概念
线程的让步的概念就是使当前运行着线程让出CPU资源,但是让给谁不知道,仅仅是让出,并且让出的时间是不可设定的,当前线程状态从运行状态回到可运行状态。
线程的让步使用Thread.yield()
方法,yield()
为静态方法,功能是暂停当前正在执行的线程对象,并执行其他线程。
实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,
则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。
sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,
所以不可能让出较低优先级的线程此时获取CPU占有权。
在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,
那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上
又被执行,所以yield()方法只能使同优先级的线程有执行的机会。
和sleep一样,yield()也不会释放锁标志。
因此要谨慎在同步环境中使用yield,因为它没有释放锁,其他线程还在等待。
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| /** * Java多线程—让步 * */ public class Test { public static void main(String[] args) { Thread t1 = new MyThread1(); Thread t2 = new Thread(new MyRunnable()); t2.start(); t1.start(); } } class MyThread1 extends Thread { public void run() { for (int i = 0; i < 10; i++) { System.out.println("线程1第" + i + "次执行!"); } } } class MyRunnable implements Runnable { public void run() { for (int i = 0; i < 10; i++) { System.out.println("线程2第" + i + "次执行!"); Thread.yield(); } } }
|
输出结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 线程2第0次执行! 线程1第0次执行! 线程2第1次执行! 线程1第1次执行! 线程2第2次执行! 线程1第2次执行! 线程2第3次执行! 线程1第3次执行! 线程2第4次执行! 线程1第4次执行! 线程2第5次执行! 线程1第5次执行! 线程2第6次执行! 线程1第6次执行! 线程2第7次执行! 线程1第7次执行! 线程2第8次执行! 线程1第8次执行! 线程2第9次执行! 线程1第9次执行!
|