package com.alex;
public class TestYield extends Thread {
public TestYield() {
}
public TestYield(String name) {
super(name);
}
public void run() {
for(int i = 0; i < 10; i++) {
System.out.println(getName() + " " + i);
if(i == 5){
Thread.yield();
}
}
}
public static void main(String[] args) {
TestYield ty1 = new TestYield("high");
ty1.setPriority(Thread.MAX_PRIORITY);
ty1.start();
TestYield ty2 = new TestYield("low");
ty2.setPriority(Thread.MIN_PRIORITY);
ty2.start();
}
}
执行结果============
high 0
low 0
high 1
low 1
high 2
low 2
high 3
low 3
high 4
low 4
high 5
low 5
high 6
low 6
high 7
low 7
high 8
low 8
high 9
low 9
按理说,high线程优先级高,线启用,应该一直执行完才对,为什么没有。
再次,low在i=4是调用yield()方法,应该让线程级别高有限执行,也没有,这是怎么回事。
yiedld这个方法是让当前线程回到可执行状态,以便让具有相同优先级的线程进入执行可执行状态,但不是绝对的保证其它线程立即得到CPU。
而且一般的电脑CPU都是4核的,你自启动了两个线程,所以它们本质上是在两个CPU上执行的,不存在竞争CPU的问题。
你可以看下自己电脑的处理器的个数,创建多余该数的线程。
int t = Runtime.getRuntime().availableProcessors();
System.out.println("CPU count:"+t);
你的处理器是多核的吧,多核CPU是可以真正实现多个线程同时运行,不需要CPU切换。
另外
首先说 线程优先级,并不能保证优先级高的先运行,也不保证优先级高的更多的分配CPU时间,只是对系统的建议而已,到底运行哪个,是操作系统决定的,都不是java说了算的。
另外java只能保证在线程内部看起来是顺序执行你的代码的,并不能保证从其他线程看来这个是按照你编码顺序执行的。
所以不要把优先级看的这么重,不同的环境影响因素太多。还是考虑线程的资源使用是否有共享或者互斥等保证资源一致性角度入手。
优先级 只是提高机率,不会绝对的它一直先