[java]多线程yield 的小议

时间:2021-01-21 17:30:12

在多线程中有这么一个状态yield,很多人翻译成线程让步。顾名思义,就是说当一个线程使用了这个方法之后,他就把自己的cpu时间让掉,让自己或者其他的线程运行。

就好像说这个线程轮到他上厕所了,然后他说“我要和大家来个竞赛',然后所有的人在同一起跑线冲向厕所。。。。有可能是别人进去了,也有可能他自己有抢到了。

我们还知道线程有个优先级的问题,那么手里有优先权的这些人就一定能抢到厕所的位置吗? 不一定的,他们只是概率上大些,也有可能没特权的抢到了。

 

先看一段代码

/**  * 线程让步,让本线程进入就绪状态,让出cup来给其他的线程  * 但是不排除下一个运行的还是本线程  * @author lzz  */
public class YieldTest extends Thread{
	public YieldTest(){
		
	}
	public YieldTest(String name){
		super(name);
	}
	@Override
	public void run() {
		for(int i=0;i<=50;i++){
			System.out.println(""+this.getName()+"-----"+i);
			if(i==30){
				this.yield();
//				System.out.println("我是"+this.getName()+"----------------"+i);       //1
			}
		}
	}
	public static void main(String[] args) {
		YieldTest yt1=new YieldTest("高");  //优先级高不代表占用所有cpu时间
		YieldTest yt2=new YieldTest("低");
//		yt1.setPriority(Thread.MAX_PRIORITY);                   //2
		yt1.start();
//		yt2.setPriority(Thread.MIN_PRIORITY);                   //2  
		yt2.start();
	}
}

这里有2块注释,1号注释和2号注释。

1 ,2号都注释的情况下:2个线程叫做高低,其实呢都是平民,这时候其实你看不出在i=30的时候有什么区别。

没有1,2注释的情况下:多次运行,你只会发现yt1这个进程抢cpu的技术比较高,每次都先完成。仔细观察i=30那条打印信息的地方

         情况1                                 

               [java]多线程yield 的小议      [java]多线程yield 的小议

 

         情况2                             

                [java]多线程yield 的小议   [java]多线程yield 的小议

      2种情况下高都是先执行到30,第1种情况高都执行到50了,低还没有到30;

                                           第2种情况下高30执行,在高没结束的时候,低执行到30了。

       理想情况是2:不管是“高”“低”,执行到30的时候,System.out.println("我是"+this.getName()); 应该是不执行的,另外一个线程继续执行,在以后的某个时刻得到cpu才执行打印信息的命令。

       特殊情况1: 因为“高”已经执行完了,所以剩下的时间都是“低”的cpu的时间了,“低”就慢慢的执行呗,i=30的时候"低“是让出了cpu,但是没人抢呀,自己就继续执行了。
       那这种情景在什么样的需求下能用到呢,比如甲乙两个人一替一会工作, “甲”在某个特定的时间遇到危险,让“乙”这个的苦逼临时当替罪羊,过阵子在继续做自己的工作。然后他们在一替一会的工作。。。。。

!!!但这只是说概率问题,没法从精确读上确保一定会这样发生,只是练习时候发现问题,提出来思考下。。。。。

相同优先级可能会出现这个种情况

[java]多线程yield 的小议


本文出自 orangleliu笔记本 博客,请务必保留此出处 http://blog.csdn.net/orangleliu/article/details/38309403