在这里ThreadTest2 是主线程,而GetThread与SetThread是两个线程.这两个线程中,SetThread是用来设置data的值,然后输出一下.而GetThread是用来输出data的值.当data的值到10后,停止输出.他们两个用object实现同步,可结果和书上的不一样,请问一下这是怎么回事,如果想实现正确的结果,应该怎么做呀,谢谢大家了.public class ThreadTest2{

int data=0;
SetThread setThread;
GetThread getThread;

Object object;

public static void main(String[] args){

ThreadTest2 threadTest2=new ThreadTest2();
threadTest2.start();

}

public ThreadTest2(){

setThread=new SetThread();
getThread=new GetThread();
object=new Object();
}

public void start(){

    getThread.start();
             setThread.start();
}

class SetThread extends Thread{

public void run(){

while(data!=10){

synchronized(object){
data++;
System.out.println("set data="+data);
}
}
System.out.println("SetThread exit");
}
}

class GetThread extends Thread{

public void run(){

while(data!=10){

synchronized(object){
System.out.println("1st get data="+data);
for(int i=0;i<1000;i++){}
System.out.println("2nd get data="+data);
}
}
System.out.println("getThread exit");
}
}
}正确结果:
1st get data=0
1nd get data=0
set data=1
1st get data=1
1nd get data=1
set data=2
1st get data=2
1nd get data=2
set data=3
1st get data=3
1nd get data=3
.................以此类推.
错误结果:
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
1st get data=0
1nd get data=0
set data=1
set data=2
set data=3
set data=4
set data=5
set data=6
set data=7
set data=8
set data=9
set data=10
Set Thread exit
get Thread exit

解决方案 »

  1.   

    你应该用wait()和notify()机制进行线程间通信
    定义一个标志位boolean flag
    比如在SetThread里面:
    while(i!=10)
    {
       if(flag)
          wait();
       else{
         data++;
         system.out.println(......);
         flag=true;
         notify();
       }
    }
    在另一个线程里稍微改一下就行了
      

  2.   

    应该是object.wait()和object.notify()
    不好意思 :)
      

  3.   

    那如果用synchronized(object)方法有办法实现吗??我感觉用notify的话,好像是两个线程时常用.上面的只是个实验,我其实是想要三个或三个以上的线程.
    谢谢了.
      

  4.   

    三个或三个以上也一样 用notifyAll()
    只不过标识位不一定是boolean了,可以自己设一些有意义的值
      

  5.   

    原来是这样呀谢谢
    如果用synchronized(object)方法有办法实现吗??
      

  6.   

    我不明白你的意思
    wait()和notify()的调用都是在synchronized(object)
    里的啊!
      

  7.   

    不好意思,我的意思是指不用notify和wait方法.而单用synchronized(object)
    像:
    public void run(){ while(data!=10){

    synchronized(object){
    data++;
    System.out.println("set data="+data);
    }
    }
    System.out.println("SetThread exit");
    }
    }
    一样通过对object锁定的方法来解决应该怎么做呢?
      

  8.   

    这样的算法如何体现线程间的唤醒呢?
    wait(),notify()不是很好用吗