我有两个类,他们都继承了Thread,一个是MyBoat,另一个是EnemyBoat.
MyBoat类只创建一个对像myBoat,而EnemyBoat创建3个对像,EnemyBoat[] enemyBoat=new EnemyBoat[3]
whichBoat是启动myBoat和enemyBoat[]线程的MyCanvas类中的一个变量,用它来记载要运行线程的名字,还用它来当synchronized(locker)中的locker.
myCanvas.setWhichBoat()方法 是根据这个当然类的名字设置下一个要启动的线程.例:如果当然是myBoat线程,myCanvas.setWhichBoat(getName())使用之后,whichBoat内容改成
enemyBoat[0]的名字,如果当然线程是enemyBoat[0],myCanvas.setWhichBoat(getName())使用之后
whichBoat内容改成enemyBoat[1]的名字.
**********************************************
问题:这个些线程只能运行一次,运行一次后出现IllegalMonitorStateException异常,
    我通过测试,发现是myCanvas.getWhichBoat().notifyAll();引起的.这是为什么???
    我的notifyAll()方法是在synchronized中呀..
    第二:
           请问,我的synchronized()语句块和wait(),notifyall()用的对吗??
    
   第一次做这东西请大家帮助.***************************************
以下为部分代码myBoat:public void run(){ while(!wreck){

synchronized(myCanvas.getWhichBoat()){ //设置

if(myCanvas.getWhichBoat()!=getName()){
                            //上面语句是说如果whichBoat的内容和当然线程的名字不相等,
                            //就让他进入等待.
try{
myCanvas.getWhichBoat().wait();
}
catch(InterruptedException ie){
}
}
                              <     要执行的代码    > myCanvas.setWhichBoat(getName()); 
        myCanvas.getWhichBoat().notifyAll();
}
        }
}
public void run(){ while(!wreck){

synchronized(myCanvas.getWhichBoat()){

if(myCanvas.getWhichBoat()!=getName()){
try{
                       myCanvas.getWhichBoat().wait();
                                     }
catch(InterruptedException ie){
} }
             <     要执行的代码    >
    myCanvas.setWhichBoat(getName());      
    
    myCanvas.getWhichBoat().notifyAll();
    
}
}

}

解决方案 »

  1.   

    错误很明显呀,你同步的对象和你调用notify的对象不是同一个对象!
    myCanvas.setWhichBoat(getName());//对象已经修改      myCanvas.getWhichBoat().notifyAll();
      

  2.   

    我在那个地方加了一个String变量.变成如下:
                    String oldBoat=myCanvas.getWhichBoat();
           myCanvas.setWhichBoat(getName());  //changed
                    oldBoat.notifyAll();
    可怎么还是出在那个异常呢????
      

  3.   

    没见过这么写同步语句的!String oldBoat=myCanvas.getWhichBoat();
    synchronized(oldBoat){}
    其他现程完全可以调用myCanvas.setWhichBoat
    你的同步对象已经无法获得了!
      

  4.   

    我有一个单独的线程,还有一个线程数组,我想要他们执行的顺序是
    myBoat->enemyBoat[0]->enemyBoat[1]->enemyBoat[2]->myBoat->enemyBoat[0]...........如此循环如果我把String oldBoat分别放到MyBoat和EnemyBoat中的话起不到同步的作用,
    如果把String oldBoat放到他们两个的外面,那它的作用就和whichBoat的作用一样了.请问一下,如何才能让我实现我希望中的同步.谢谢你.请问您有QQ或msn吗?能告诉我一下吗谢谢了.
      

  5.   

    怎么循环?都已经运行完了,是不是又重新运行它们?
    如果要保证他们按顺序的话,为什么要用同步,直接join不就完了