JAVA: Как я могу принять ввод только в течение определенного периода времени - PullRequest
1 голос
/ 30 апреля 2010

Я пытаюсь сделать простую игру, в которой мне постоянно нужны отзывы игроков. Это должно произойти только в течение определенного периода времени. Все, что отправлено после этого, будет отброшено. После определенного периода времени начинается новая игра. Итак:

  1. Начало игры
  2. Ожидание ввода от всех игроков в течение 10 секунд
  3. 10 секунд больше нет ввода

  4. Подсчитайте победителя и сделайте кое-что
  5. Перейти к 1.

Я думал об использовании таймера и таймера для отслеживания времени и, возможно, использовать логическую переменную, которая меняется с «открытого» на «закрытый» через 10 секунд? Пожалуйста, дайте мне совет по этому поводу.

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

Вместо того, чтобы использовать Timer и TimerTask, я бы обновил ваше мышление до более современного способа использования Executors . С ScheduledExecutor вы можете запланировать Runnable как:

// class member or perhaps method var
private boolean acceptInput = true;

// elsewhere in code
ScheduledExecutor executor = new ScheduledExecutor(1);
startGame();
mainLoop();
executor.schedule(flipInput, 10, TimeUnit.SECONDS);

// inner class
private class FlipInput implements Runnable {
    public void run() {
        acceptInput = !acceptInput;
        calculateWinner();
        doSomeStuff();
        startGame();
        executor.schedule(flipInput, 10, TimeUnit.SECONDS);
        mainLoop();
    }
}
0 голосов
/ 30 апреля 2010

Да, вам понадобится таймер, и какой-нибудь флаг «открыто / закрыто» будет подходящим вариантом.

Убедитесь, что ваш флаг "volatile", чтобы все потоки, читающие ваш ввод, сразу увидели изменение.

Если подумать, вы можете даже подумать о том, чтобы задача таймера ударила прерывание по каждому из потоков считывателя, поэтому им всем сообщают сразу, а не всякий раз, когда они всплывают для проверки.

0 голосов
/ 30 апреля 2010

Вы правы, с помощью таймера вы можете изменить это значение:

 Timer timer = new Timer();
 timer.schedule( new TimerTask(){
       public void run() {
            synchronized( lock ) { 
                isOpen = false;
            }
        }
   }, 10000 );

И это все. Метод внутри run будет выполнен через 10 секунд после вызова schedule

EDIT

Пример:

import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;
import static java.lang.System.out;

public class Test {
    public static void main( String [] args ) {
        Timer timer = new Timer();
        timer.schedule( new TimerTask(){
            public void run() {
                out.println(new Date()+" No more bets, thank you!");
            }
        }, 10000 );
        out.println(new Date() + " Place your bets, place your bets!!");
    }
}
...