java线程中的yield

    今天看老外的代码,里面用到了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%切换。

 

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值