Re: TimerTask not work as expected
On Jan 13, 4:06 am, Travers <tna...@gmail.com> wrote:
I don't think you understand the Java API you are using. You will not =
get the results you want until you understand what you are playing with.
Timer() spawns a thread and returns _instantly_ thus btnRoll() ends befor=
e the TimerTask is even executed. Timer is not "synchronous"--it does no=
t wait for the tasks to finish.
But I also think you have structured your program poorly. For event-dr=
iven GUI programs, especially games, you have to give up "Do A then do B" s=
tructure.
But if you want to make sure btnRoll()'s Timer task thread finishes first=
, you should add code in btnRoll to _wait_ for the Timer task to finish.
Thanks for your help, I think I have solved the synchronous problem. I
have added an Object lock to do the syn.
public void btnRoll(){
final Timer timer = new Timer();
final int index = turn - 1;
boolean snakeEyes = false;
dice1 = (int)(Math.random() * 6 + 1);
dice2 = (int)(Math.random() * 6 + 1);
if(dice1 == dice2) {
snakeEyes = true;
rolled = false;
}
if(snakeEyes == true){
tempFlagPlayer = true;
}else{
tempFlagPlayer = false;
}
timer.schedule(new TimerTask(){
private int diceSum = dice1 + dice2;
public void run(){
synchronized(lock) {
if (diceSum > 0){
movePlayer(players.get(index), tempFlagPlayer); // move player
one space each time
diceSum --;
repaint();
}else{
checkPlayerMovedStatus(players,tempFlagPlayer);
propertymanager.CheckProperty(turn,
players.get(index).getPosition());
lock.notify();
rolled = true;
timer.cancel();
}
repaint();
}
}
}, 100L,100L);
repaint();
}
and in AIturn(int tempNumOfPlayers){
public void AIturn(int tempNumOfPlayers){
btnRoll();
synchronized(lock) {
if(!rolled){
try{
lock.wait();
}
catch(InterruptedException e){}
}
if(propertymanager.Properties[players.get(turn-1).getPosition()]
[0] == 0){
SystemLogHelper.info("enter btnBuy()");
btnBuy();
}
if(rolled) {
btnDone(tempNumOfPlayers);
}
}
}
but I found there is another problem for AIturn(int tempNumOfPlayers),
in the btnRoll() in AIturn(),
if (diceSum > 0){
movePlayer(players.get(index), tempFlagPlayer); // move player one
space each time
diceSum --;
repaint();
}
I found the repaint() doesn't work when it comes to AIturn() call, is
it repaint must be triggered by ActionListener component? If there any
way to force repaint()? Thanks.