таймер Java на текущем экземпляре - PullRequest
0 голосов
/ 29 марта 2010
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;


public class Boggle {
    Board board;
    Player player;
    Timer timer;
    boolean active;

    static Scanner in = new Scanner(System.in);

    public Boggle() {
        board = new Board(4);
        timer = new Timer();
    }

    public void newGame() {
        System.out.println("Please enter your name: ");
        String line = in.nextLine(); 
        player = new Player(line);
        active = true;

        board.shuffle();
        System.out.println(board);

        timer.schedule(new timesUP(), 20000);
        while(active) {
            String temp = in.nextLine();
            player.addGuess(temp);
        }
    }


    public void endGame() {
        active = false;
        int score = Scoring.calculate(player, board);
        System.out.println(score);
    }


    class timesUP extends TimerTask {
        public void run() {
            endGame();
        }
    }


    public static void main(String[] args) {
            Boggle boggle = new Boggle();
            boggle.newGame();

    }
}

У меня есть вышеуказанный класс, который должен выполнять цикл в течение заданного промежутка времени, а затем вызывать метод экземпляра. По сути, мне нужно, чтобы цикл в newGame () запускался в течение минуты или около того, прежде чем endGame () будет вызван в текущем экземпляре. Однако, используя класс Timer, я не уверен, как бы я вызвал метод, который мне нужен, в текущем экземпляре, так как я не могу передать какие-либо параметры методу запуска timertasks?

Есть ли простой способ сделать это или я поступаю неправильно? (примечание: это только консольный проект, без графического интерфейса)

==========

код отредактирован

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

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Поскольку timesUP (пожалуйста, измените имя!) Является внутренним классом, у него уже есть ссылка на экземпляр Boggle, который его создал. (Это было бы не так, если бы оно было помечено как static.) Если вы хотите создать экземпляр timesUP, связанный с другим экземпляром, вы бы сделали что-то вроде:

otherBoggle.new timesUp();

Это довольно странный синтаксис, правда:)

Это не решает проблему, которую Midhat определил, по общему признанию - но это означает, что вам не нужно беспокоиться о получении ссылки на внешний класс. Просто позвоните endGame() изнутри timesUP.run(), и он вызовет его в соответствующем экземпляре.

0 голосов
/ 29 марта 2010

У вас есть блокировка ввода консоли в потоке. Время работы будет продиктовано этим. Вы можете иметь консольный ввод в отдельном потоке и добавить таймер в текущем потоке, чтобы через минуту убить поток ввода, и вызвать this.endGame ()

...