java - 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。
解决方案
推荐阅读
- javascript - 在AngularJs中从后端获取数据时格式化日期时间
- reactjs - reactjs函数在分配变量后调用
- python - Python 2.7:在保存之前检查excel文件是否已经在程序中打开
- python - 如何在 python 中修复“NameError: name 'name' is not defined”?
- c# - 如何完全控制 http 标头?
- python - 在 pyspark 中使用 pandas_udf 过滤数据帧
- php - Laravel 不为序列化模型加载关系
- python - 如何从 odoo 上的 Many2One 关系中获取属性?
- python - 在没有冒号的空格周围拆分字符串
- excel - 为什么这段代码不能用数据输入在工作表中创建一个新的