java线程中的yield

来源:互联网 发布:罗马2全面战争修改数据 编辑:程序博客网 时间:2024/06/05 10:46

    今天看老外的代码,里面用到了yield,以前很少用这个方法,所以补充一下yield的知识,下面是网上找的测试代码:

public class TestYield {public static void main(String[] args) {MyThread3 t1 = new MyThread3("t1");MyThread3 t2 = new MyThread3("t2");t1.start();t2.start();}}class MyThread3 extends Thread {public MyThread3(String s) {super(s);}public void run() {for (int i = 1; i < 100; i++) {System.out.println(getName() + "=" + i);if (i % 10 == 0) {yield();}}}}


代码出自:http://hi.baidu.com/gaozerd/item/5a1a6bc873c05f0cad092f51

里面有句话说:每到10的倍数的时候,就会切换线程。

其实不然,我亲测了一下,结果如下:

t1=1t2=1t1=2t2=2t1=3t2=3t1=4t2=4t1=5t2=5t2=6t2=7t2=8t2=9t2=10t2=11t2=12t2=13t2=14t2=15t2=16t2=17t2=18t2=19t2=20t2=21t2=22t1=6t2=23t1=7t2=24t1=8t2=25t1=9t2=26t1=10t2=27
.
.

 

并不是说,每到10的倍数的时候,就会切换线程。

看看API的解释吧。

public static void yield() 暂停当前正在执行的线程对象,并执行其他线程。 

 

API的解释也让人摸不着头脑,按理说t2=10,t2=20时应该切换到t1啊,可是结果并不是这样的。

 

又baidu了一下,有人说yield是让当前线程回到可运行状态,这个解释很合理。

http://miles801.blog.163.com/blog/static/174979588201106115211936/

yield的真正用途是:使当前线程从执行态变为可执行态,也就是就绪态吧。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次不会执行到了。

 

如果我想达到10的倍数的时候就会切换线程该怎么做呢?

interrupt(); 还靠点谱,不过实现几次还是有问题,不能100%切换。

 

以后再想想其他办法吧。今天先到这里。


 

0 0
原创粉丝点击