temporizador java na instância atual
Pergunta
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();
}
}
Eu tenho a classe acima que deve executar um loop por um determinado período de tempo e depois invocar um método de instância.Essencialmente, preciso que o loop em newGame() seja executado por cerca de um minuto antes de endGame() ser invocado na instância atual.No entanto, usando a classe Timer, não tenho certeza de como invocaria o método necessário na instância atual, pois não consigo passar nenhum parâmetro para o método de execução timertasks.
Existe uma maneira fácil de fazer isso ou estou fazendo isso da maneira errada?(observação:este é apenas um projeto de console, sem GUI)
==========
código editado
Alterei o código acima seguindo as recomendações e funciona quase como esperado, mas o tópico ainda parece não terminar corretamente.Eu era o loop while que morreria e o controle eventualmente voltaria ao método principal.Alguma ideia?
Solução
Porque timesUP
(por favor, mude o nome!) é uma classe interna, ela já possui uma referência à instância de Boggle
que o criou.(Isso não seria o caso se fosse marcado como static
.) Se você quisesse criar uma instância de timesUP
associado a outra instância, você faria algo como:
otherBoggle.new timesUp();
É uma sintaxe bem estranha, admito :)
É certo que isso não resolve o problema identificado por Midhat - mas significa que você não precisa se preocupar em obter uma referência à classe externa.Apenas ligue endGame()
de dentro timesUP.run()
e ele irá chamá-lo na instância apropriada.
Outras dicas
Você bloqueou a entrada do console no thread.O tempo de execução será ditado por isso.Você pode ter a entrada do console em um thread separado e adicionar um cronômetro no thread atual para encerrar o thread de entrada após um minuto e chamar this.endGame()