yield 礼让线程,暂停线程 直接进入就绪状态不是阻塞状态
package thread.lzy.www;
/**
* yield 礼让线程,暂停线程 直接进入就绪状态不是阻塞状态
* @author Administration
*
*/
public class cYieldDemo01 {
public static void main(String[] args) {
MyYield my=new MyYield();
new Thread(my,"a").start();
new Thread(my,"b").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"-->start");
Thread.yield();
System.out.println(Thread.currentThread().getName()+"-->end");
}
}
上面代码中,代码运行到21行Thread.yield();表示将线程由运行状态转入就绪状态,让cpu调度器重新调度(也就是运行到21行后让cpu重新选择 有可能会选择b也有可能继续选择a,并不是重新调度后就一定会去运行b,而是a和b都有可能会被调用运行)
实例二、
package thread.lzy.www;
/**
* yield 礼让线程,暂停线程 直接进入就绪状态不是阻塞状态
* @author Administration
*
*/
public class cYieldDemo02 {
public static void main(String[] args) {
new Thread(()->{
for(int i=0;i<20;i++) {
System.out.println("lambda..."+i);
}
}) .start();
for(int i=0;i<20;i++) {
if(i%2==0) {
Thread.yield();
}
System.out.println("main.."+i);
}
}
}
以上代码表示让程序有规律的去礼让,17-19行当i是2的倍数时,去礼让,同样在这里当i为2的倍数 礼让时,cpu可能会调用lambda中的System.out.println(“lambda…”+i);,也可能继续调用main方法中的System.out.println(“main…”+i);
运行结果:
main…0
main…1
main…2
lambda…0
main…3
lambda…1
main…4
lambda…2
main…5
main…6
lambda…3
main…7
lambda…4
main…8
lambda…5
lambda…6
lambda…7
main…9
lambda…8
lambda…9
lambda…10
lambda…11
main…10
lambda…12
lambda…13
lambda…14
lambda…15
lambda…16
main…11
main…12
main…13
lambda…17
main…14
main…15
lambda…18
main…16
main…17
lambda…19
main…18
main…19
可以看出在main…12,main…14,main…16都没有礼让成功,虽然在运行Thread.yield(),但CPU仍然选择的main方法运行,所以说Yield只是给CPU一个重新调度的机会,重新调谁是说不准的