多线程——礼让yield

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一个重新调度的机会,重新调谁是说不准的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值