While循环中的Java TimerTask

时间:2019-01-08 00:24:51

标签: java timer synchronization 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。

0 个答案:

没有答案