目前,我正在使用计时器来执行我的技能效果。它将每3秒对所有技能效果进行一次心跳。
这是我的代码:
public class EffectServiceImpl extends AbsServiceAdaptor<EffectConfig> {
private static EffectServiceImpl instance;
private FastList<Monster> existsEffectMonsterList;
private Timer timer;
public static EffectServiceImpl getInstance() {
if(null == instance) {
instance = new EffectServiceImpl();
}
return instance;
}
private EffectServiceImpl() {
existsEffectMonsterList = new FastList<Monster>();
timer = new Timer();
timer.schedule(new MonsterEffectCheckTask(), 10000, 3000); // Heartbeat every 3 seconds
}
public class MonsterEffectCheckTask extends TimerTask {
@Override
public void run() {
if(existsEffectMonsterList.size() > 0) {
Monster monster;
Effect effect;
for(int i = 0; i < existsEffectMonsterList.size();) {
monster = existsEffectMonsterList.get(i);
if(monster.effectList.size() > 0) {
for(int j = 0; j < monster.effectList.size();) {
try {
effect = monster.effectList.get(j);
if(effect.heartbeat(monster)) {
j++;
}
}
catch(Exception e) {
e.printStackTrace();
break;
}
}
}
if(monster.effectList.size() == 0) {
existsEffectMonsterList.remove(i);
}
else {
i++;
}
}
}
}
}
}
但是我希望不是所有的技能特效都能做3秒的心跳,会有小于3秒或者大于3秒的心跳技能(即动态周期)。
所以我将timer.附表
的句点更改为1:
...
timer.schedule(new MonsterEffectCheckTask(), 10000, 1);
...
然后将Thread.睡眠
添加到TimerTask:
...
if(monster.effectList.size() > 0) {
for(int j = 0; j < monster.effectList.size();) {
try {
effect = monster.effectList.get(j);
if(effect.heartbeat(monster)) {
j++;
}
Thread.sleep(effect.execTime); // This is dynamic time, each effect has an `execTime`. Code `public int execTime;`
}
catch(InterruptedException e) {
e.printStackTrace();
}
catch(Exception e) {
e.printStackTrace();
break;
}
}
}
...
如果是上面这样的代码,我应该:使用计划
或计划
或任何其他?有什么解决方案来替换Thread.睡眠
以防想要“暂停”定时器?我应该设置延迟
和周期
(我知道如果我设置为0我会得到一个IllegalArgumentException
,但如果设置为1太短)?我希望效果在“暂停”时间到期后立即心跳。此外,可以有许多效果相同的心跳,但每个效果的“暂停”时间不一样。
我将感激你的回答。