首页 > 解决方案 > While循环中的Java TimerTask

问题描述

我想在某些条件为真时在 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。

标签: javatimersynchronizationtimertask

解决方案


推荐阅读