日期:2014-05-20 浏览次数:20685 次
/** * Causes the currently executing thread object to temporarily pause * and allow other threads to execute. */ public static native void yield();
------解决方案--------------------
给一个关于优先级的线程例子给楼主看,希望楼主有所体会
public class Ex8_13{
public static void main(String[] args) {
TestThread[] runners = new TestThread[2];
for (int i = 0; i < 2; i++) runners[i] = new TestThread(i);
runners[0].setPriority(2); //设置第一个线程优先级为2
runners[1].setPriority(3); //设置第二个线程优先级为3
for (int i = 0; i < 2; i++) runners[i].start();
}
}
class TestThread extends Thread{
private int tick = 1;
private int num;
public TestThread(int i) { this.num=i; }
public void run() {
while (tick < 400000) {
tick++;
if ((tick % 50000) == 0) { //每隔5000进行显示
System.out.println("Thread #" + num + ", tick = " + tick);
yield(); //放弃执行权
}
}
}
}
运行结果
Thread #1, tick = 50000
Thread #1, tick = 100000
Thread #1, tick = 150000
Thread #1, tick = 200000
Thread #1, tick = 250000
Thread #1, tick = 300000
Thread #1, tick = 350000
Thread #1, tick = 400000
Thread #0, tick = 50000
Thread #0, tick = 100000
Thread #0, tick = 150000
Thread #0, tick = 200000
Thread #0, tick = 250000
Thread #0, tick = 300000
Thread #0, tick = 350000
Thread #0, tick = 400000
结果说明
具有较高优先级的线程1一直运行到结束,具有较低优先级的线程0才开始运行
虽然具有较高优先级的线程1调用了yield方法放弃CPU资源,允许线程0进行争夺,但马上又被线程1抢夺了回去,所以有没有yield方法都没什么区别
这个例子充分说明了,即使t1线程自己暂停了,放弃cpu资源,但是cpu接下来调度哪个线程是不知道的,有可能调度t2,出现第二种情况,但是也有可能继续调用t1,像上面的例子那样一直抢占,所以出现哪种情况都是很正常的,大家都没有什么错
但是在这里我觉得有些人有错:我不明白为什么人家问问题还要被人骂?什么傻B不傻B的,难道回答者很了不起吗?在哪里工作?IBM?微软?在哪里读书?清华北大?恐怕就算这些地方的高级人才也没敢这么骂人,这么骂人是会打击人家的学习信心的,楼主不要放弃,JAVA与你同在。