Java - 由Timer控制的多个对象(用于游戏)

时间:2011-10-19 23:55:12

标签: java android multithreading timer

我目前正在开发一款小型游戏,其中包含一些随机弹出不同时间的目标。实际的游戏将从电路板获得它的I / O,因为目标是物理的。

我的问题是,目前我有一个java.util.Timer,每2秒触发一次。一旦被触发,将显示随机目标(到目前为止工作正常)。问题是我希望在计时器仍在运行并设置其他目标时,在1-5之间随机显示秒数。

我没有错误,目标显示但永远不会消失。我想这是某种线程问题,也许因为我正在使用这个。* ,目标对象只是以某种方式迷失在幽冥中!在这里搜索问题之后,我想出了这个:

public class Target implements Runnable(){

  ...

    public void displayFor(int seconds){
        this.display();

        Executors.newSingleThreadScheduledExecutor().schedule(this,time,
                TimeUnit.SECONDS);

        this.setDisplayed(false);
    }

    @Override
    public void run() {
        this.destroy();
    }

}

基本上,初始游戏计时器(目标显示的集合)调用 displayFor(2)方法,该方法在经过时间后运行目标运行方法。目标仍然不会消失。

我已经尝试了很多不同的方法,比如 displayFor()设置另一个java.util.Timer,我也开始使用Quartz库(说实话)反正似乎有点过头了)仍然无法让它发挥作用。由于没有错误信息,我真的不知道这个。

我没有包含很多代码,因为我不认为它是相关的,但是如果你们需要更多信息来帮助我们知道:)

2 个答案:

答案 0 :(得分:1)

我设法让它发挥作用。对于处于类似情况的任何人来说,这是正确的代码。

public class Target{

private Timer timer;

   ...

   public void displayFor(int seconds) {
     // send the output
     BoardInterface.SetDigitalChannel(this.getId());

     // calculate the delay
     long time = seconds * 1000;

     // create a new timer and schedule the new task
     timer = new Timer();
     timer.schedule(new TargetTimer(this), time);

     this.setDisplayed(true);
  }
}

class TargetTimer extends TimerTask{
   Target target;

   public TargetTimer(Target t){
       this.target = t;
   }

   @Override
   public void run() {
       target.destroy();
   }

}

不确定这是否是一种很好的方法,但它有效。如果您发现任何可以改进的地方,请告诉我们。谢谢你们!

答案 1 :(得分:0)

也许您应该告诉我们display方法的作用。

un - 在destroy /析构函数代码中显示目标?

我建议{strong}改为 <{1}}:

void display()

当然

public void setDisplayed(boolean display){
  if(display) {
    ///... do appropriate circuit output to turn on target
  } else {
    /// ... do appropriate circuit output to turn off target
  }
}