`
只帅一次
  • 浏览: 32506 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics