Нить часов для обратного отсчета в Java - PullRequest
1 голос
/ 24 марта 2020

У меня есть готовая игра вопросов Java, со счетчиком времени для каждого вопроса. У игроков есть 10 секунд, чтобы ответить на каждый вопрос. Чтобы реализовать счетчик, я создал класс Clock, который вызывает бота (класс разработчика игры), используя класс команд, который отправляет сообщение «обновить экран обратного отсчета» (каждый импульс может вызывать игру, чтобы обновить данные экрана с новым оставшимся временем. , так что игроки могут увидеть обратный отсчет 9, 8, 7 ...). Когда часы заканчиваются, отправляется сообщение «показать результаты и задать новый вопрос».

private class Clock extends Thread {

    CommandMessage endClock = null;
    CommandMessage pulseClock = null;
    BotTrivial bot;
    long seconds = 10L;
    long restSeconds = seconds; //To show how many seconds left to end the counter.
    boolean isCancelled = false;

    @Override
    public void run() {
        this.setPriority(Thread.MAX_PRIORITY);
        try {
            int i = 0;
            restSeconds = seconds;
            //Command for each pulse if available (for example, upgrade screen)
            while (i < seconds && !this.isCancelled) {
                if (this.pulseClock != null && !this.isCancelled) {
                    this.bot.executeCommand(pulseClock);
                }
                TimeUnit.SECONDS.sleep(1);
                i++;
                restSeconds--;
                if (this.isCancelled) {
                    isCancelled = false;
                    return;
                }
            }
            //Command to end if available.
            if (endClock != null && !this.isCancelled) {
                this.bot.executeCommand(endClock);
            }
            isCancelled = false;
        } catch (InterruptedException excp) {
            ErrorRegister.addErrorLogAndCommand("Error: " + excp);
        }
    }

    public void cancel() {
        this.isCancelled = true;
    }

    public long getRestSeconds() {
        return this.restSeconds;
    }
}

Проблема: иногда часы «спят» слишком много времени, гораздо больше, чем 1 секунда. Я могу быть заблокирован на 15 секунд и более. Я установил максимальный приоритет, и результат тот же. Кроме того, это непредсказуемо, когда произойдет больший, чем ожидалось, блок.

Как я могу убедиться, что он блокируется только на секунду?

Спасибо.

...