日期:2014-05-20  浏览次数:20614 次

请教高手一个线程同步的问题!
package countbirds;
public class Machine14 implements Runnable{
private int a=1;
public void run(){
for(int i=0;i<1000;i++){
a+=i;
Thread.yield();
a-=i;
System.out.println(a);
}

}

public static void main(String[] args) throws InterruptedException{
Machine14 machine=new Machine14();

Thread t1=new Thread(machine);
Thread t2=new Thread(machine);

t1.start();
t2.start();
}
}

为什么这个程序运行的结果是
1
1
1
1
1
...

而不是
1
2
2
3
3
...
我不明白我错在哪了,恳请各位赐教

------解决方案--------------------
Java code

    /**
     * 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与你同在。