java编程思想练习题-第21章练习1-yield

题目:实现一个Runnable。在run()内部打印一个消息,然后调用yield()。重复这个操作三次,然后从run中返回。在构造器中放置一条启动消息,并且放置一条在任务终止时的关闭消息。使用线程创建大量的这种任务并驱动他们。

 

package test;

public class test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=1;i<=10;i++){
			new Thread(new runabletest()).start();;
		}
	}

}

class runabletest implements Runnable{
	public String  startstr="start!";
	public  String stopstr="stop!";
	static int num=0;
	public int id;
	public runabletest(){
		num++;
		id=num;
		startstr="#"+id+"  "+startstr;
		stopstr="#"+id+"  "+stopstr;
		System.out.println(startstr);
		
	}
	@Override
	public void run() {
		for(int i=1;i<=3;i++){
			System.out.println("#"+id+" loop"+i);
			Thread.yield();
		}
		System.out.println(stopstr);
	}
	
}

 结果是:

#1  start!
#2  start!
#3  start!
#1 loop1
#2 loop1
#2 loop2
#1 loop2
#1 loop3
#1  stop!
#2 loop3
#2  stop!
#4  start!
#3 loop1
#3 loop2
#5  start!
#4 loop1
#3 loop3
#4 loop2
#3  stop!
#4 loop3
#4  stop!
#6  start!
#7  start!
#5 loop1
#5 loop2
#5 loop3
#5  stop!
#7 loop1
#6 loop1
#8  start!
#6 loop2
#7 loop2
#7 loop3
#6 loop3
#6  stop!
#7  stop!
#9  start!
#8 loop1
#8 loop2
#8 loop3
#8  stop!
#10  start!
#9 loop1
#9 loop2
#9 loop3
#9  stop!
#10 loop1
#10 loop2
#10 loop3
#10  stop!

 如果把yield去掉的话结果是:

#1  start!
#2  start!
#3  start!
#1 loop1
#1 loop2
#1 loop3
#1  stop!
#4  start!
#2 loop1
#5  start!
#2 loop2
#2 loop3
#2  stop!
#5 loop1
#5 loop2
#5 loop3
#5  stop!
#3 loop1
#3 loop2
#3 loop3
#3  stop!
#4 loop1
#4 loop2
#4 loop3
#4  stop!
#6  start!
#7  start!
#8  start!
#7 loop1
#7 loop2
#7 loop3
#7  stop!
#6 loop1
#6 loop2
#6 loop3
#6  stop!
#9  start!
#10  start!
#9 loop1
#9 loop2
#9 loop3
#9  stop!
#10 loop1
#10 loop2
#10 loop3
#10  stop!
#8 loop1
#8 loop2
#8 loop3
#8  stop!

 结论:我们发现把yield去掉之后每个线程的三次循环基本都一下子输出了,因为任务比较简单可以在一个时间片内完成,所以在中途没有切换上下文。而增加了yield之后,执行完一次循环之后,该线程有很大几率被切换掉。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值