Как в Java выполнять код каждые X секунд?

Я делаю очень простую игру про змей, и у меня есть объект Apple, который я хочу перемещать в случайное положение каждые X секунд. Итак, мой вопрос: как проще всего выполнять этот код каждые X секунд?

apple.x = rg.nextInt(470);
apple.y = rg.nextInt(470);

Спасибо.

Редактировать:

У вас уже есть такой таймер:

Timer t = new Timer(10,this);
t.start();

Что он делает, так это рисует мои графические элементы при запуске игры, он запускает этот код:

@Override
    public void actionPerformed(ActionEvent arg0) {
        Graphics g = this.getGraphics();
        Graphics e = this.getGraphics();
        g.setColor(Color.black);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        e.fillRect(0, 0, this.getWidth(), this.getHeight());
        ep.drawApple(e);
        se.drawMe(g);

person Misoxeny    schedule 23.11.2012    source источник
comment
возможный дубликат Как установить таймер в java   -  person Nim    schedule 23.11.2012
comment
У меня есть таймер, я отредактировал свой вопрос, чтобы вы могли видеть, как он выглядит.   -  person Misoxeny    schedule 23.11.2012
comment
В вашей игре про змей есть многопоточность?   -  person ThePerson    schedule 23.11.2012
comment
Нет, я понятия не имею, что такое потоки, ха-ха. ^_^   -  person Misoxeny    schedule 23.11.2012
comment
zetcode.com/tutorials/javagamestutorial   -  person Sri Harsha Chilakapati    schedule 23.11.2012
comment
ntu.edu.sg/home/ehchua/programming/java/ J8d_Game_Framework.html   -  person Sri Harsha Chilakapati    schedule 23.11.2012


Ответы (4)


Проще всего использовать sleep.

        apple.x = rg.nextInt(470);
        apple.y = rg.nextInt(470);
        Thread.sleep(1000);

Запустите приведенный выше код в цикле.

Это даст вам приблизительную (может быть не точную) задержку в одну секунду.

person Yogendra Singh    schedule 23.11.2012

Я бы использовал исполнителя

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    Runnable toRun = new Runnable() {
        public void run() {
            System.out.println("your code...");
        }
    };
ScheduledFuture<?> handle = scheduler.scheduleAtFixedRate(toRun, 1, 1, TimeUnit.SECONDS);
person user1121883    schedule 23.11.2012

Используйте таймер:

Timer timer = new Timer();
int begin = 1000; //timer starts after 1 second.
int timeinterval = 10 * 1000; //timer executes every 10 seconds.
timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    //This code is executed at every interval defined by timeinterval (eg 10 seconds) 
   //And starts after x milliseconds defined by begin.
  }
},begin, timeinterval);

Документация: Таймер документации Oracle

person Ospho    schedule 06.08.2013

У вас должен быть какой-то игровой цикл, который отвечает за обработку игры. Вы можете инициировать выполнение кода в этом цикле каждые x миллисекунд, например:

while(gameLoopRunning) {
    if((System.currentTimeMillis() - lastExecution) >= 1000) {
        // Code to move apple goes here.

        lastExecution = System.currentTimeMillis();
    }
}

В этом примере условие в операторе if будет оцениваться как true каждые 1000 миллисекунд.

person Phil K    schedule 23.11.2012