Re: TimerTask not work as expected
On Jan 12, 2:45 pm, Travers Naran <tna...@gmail.com> wrote:
On 11/01/2011 10:10 PM, SamuelXiao wrote:
Hi all, I am writing a simple monopoly board game, there're only 2
tokens, one is controlled by human, another by PC. I am trying to
make it turn based and move around the map step by step. Then when I
use TimerTask to trigger the step-forward movement, it's ok for the
token controlled by human, but for the PC one. It doesn't move as
expected. Below is part of the codes for Dice Roll button& Done
button.
timer.schedule(n=
ew TimerTask(){
private int temp = Dice1 + Dice2;
public void run(){
if (temp> 0){
SystemLogHelper.debug("btnRoll()=
's players.get(index): " + index);
movePlayer(players.get(index), tempFlagPlayer); // move player one
space each time
=
temp --;
}else{
checkPlayerMovedStatus(players,t=
empFlagPlayer);
cancel();
}
repaint();
}
}, 100L,100L);
how could I make sure that btnRoll() is done then go to the next
code?
Any help would be appreciated.
Timer runs TimerTask in a _separate_ thread. There are a few ways you
could synchronize this, but I'd recommend looking at wait()/notify().
Try to remember that you are waiting for your TimerTask to be called
Dice1+Dice2 times before you leave.- Hide quoted text -
- Show quoted text -
Hi Travers,
Thanks for youjr suggestion, I use wait() now, but it comes to another
problem. I added wait() in the AITurn() method..Then now an exception
was caught..
public void AIturn(int tempNumOfPlayers){
long temp = (long) (Dice1 + Dice2) * 100;
btnRoll();
SystemLogHelper.info("players.get(turn-1): " +
players.get(turn-1).getName());
SystemLogHelper.info("players.get(turn-1).getPosition(): " +
players.get(turn-1).getPosition());
try {
this.wait(temp);
// notify();
// Thread.sleep(temp);
}
catch(InterruptedException e){}
if(propertymanager.Properties[players.get(turn-1).getPosition()]
[0] == 0){
SystemLogHelper.info("enter btnBuy()");
btnBuy();
}
btnDone(tempNumOfPlayers);
// }
// if(rolled) btnDone(tempNumOfPlayers);
}
// IllegalMonitorStateException
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at com.xxx.applet.MonopolyBoard.AIturn(MonopolyBoard.java:822)
at com.xxx.applet.MonopolyBoard.btnDone(MonopolyBoard.java:485)
at com.xxx.applet.MonopolyEntry.actionPerformed(MonopolyEntry.java:
140)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
seems that if I use wait(), these btnDone()/btnRoll() will be lost its
eventlistener? Is my understanding correct? I tried notify()/sleep()
and so on...but they doesn't work. wait() method can provide the token-
movement as I wanted but it is able to trigger btnDone() method