当某些情况为真时,我想在Timer中运行TimerTask。
我为定时事件提供的代码如下:
public Double timedAttack(Fighter target){
TimerTask task = new TimerTask() {
public void run() {
attack(target);
}
};
Timer timer = new Timer();
long speed = Math.round(getStats().getSpeed() * 1000);
timer.schedule(task, speed);
return stats.getDamage();
}
这将创建一个计时器,战斗机必须在该计时器等待其攻击时间才能对目标执行攻击。目标将同样在战斗机上执行此方法。
我遇到的问题在于以下方法:
public boolean battle(Fighter target){
while(target.isAlive() && this.isAlive()){
if(isAlive()) {
timedAttack(target);
} else {
break;
}
if(target.isAlive()) {
Double damageDelt = target.timedAttack(this);
target.getStats().increaseFitness(damageDelt);
} else {
break;
}
}
printBattleResult(target);
return battleResult(target);
}
问题在于,while循环不断创建新的计时器,最终导致堆栈溢出。
我希望它在运行方法timedAttack之前检查TimerTask是否已执行。我尝试过传递对TimerTask的引用,但是没有内置方法来检查Timer是否完成。
我还尝试实现自己的TimerTask,其中包括一个isDone变量以检查TimerTask是否完成,但这也无济于事,因为直到执行timedAttack方法之后,我才可以访问TimerTask(无论如何都将创建一个新计时器)
我还考虑过创建TimerTask的实例变量,以便我可以随时访问其方法/属性。但是,由于需要将目标传递给它进行攻击,因此这也被证明不是很有帮助。
如果有人对如何执行此操作有任何有益的建议,我将不胜感激。
我对线程/线程不是很熟悉,所以任何建议都是有帮助的。
这与如何停止TimerTask并不相同,因为我对它的完成方式很熟悉。如果先前的TimerTask已经完成,那么我的问题是针对每次循环的迭代创建一个TimerTask。