我有两个类,他们都继承了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();
}
}
}
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();
}
}
}
myCanvas.setWhichBoat(getName());//对象已经修改 myCanvas.getWhichBoat().notifyAll();
String oldBoat=myCanvas.getWhichBoat();
myCanvas.setWhichBoat(getName()); //changed
oldBoat.notifyAll();
可怎么还是出在那个异常呢????
synchronized(oldBoat){}
其他现程完全可以调用myCanvas.setWhichBoat
你的同步对象已经无法获得了!
myBoat->enemyBoat[0]->enemyBoat[1]->enemyBoat[2]->myBoat->enemyBoat[0]...........如此循环如果我把String oldBoat分别放到MyBoat和EnemyBoat中的话起不到同步的作用,
如果把String oldBoat放到他们两个的外面,那它的作用就和whichBoat的作用一样了.请问一下,如何才能让我实现我希望中的同步.谢谢你.请问您有QQ或msn吗?能告诉我一下吗谢谢了.
如果要保证他们按顺序的话,为什么要用同步,直接join不就完了