今天看老外的代码,里面用到了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=1
t2=1
t1=2
t2=2
t1=3
t2=3
t1=4
t2=4
t1=5
t2=5
t2=6
t2=7
t2=8
t2=9
t2=10
t2=11
t2=12
t2=13
t2=14
t2=15
t2=16
t2=17
t2=18
t2=19
t2=20
t2=21
t2=22
t1=6
t2=23
t1=7
t2=24
t1=8
t2=25
t1=9
t2=26
t1=10
t2=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%切换。
以后再想想其他办法吧。今天先到这里。