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 run方法?
有一种简单的方法可以做到这一点,还是我以错误的方式解决这个问题? (注意:这只是一个控制台项目,没有GUI)
==========
代码编辑
我已根据建议将代码更改为上面的内容,并且它几乎按照我的预期工作,但线程似乎仍未正确结束。我是while循环会死,控制最终会回到main方法。有什么想法吗?
答案 0 :(得分:1)
因为timesUP
(请更改名称!)是一个内部类,它已经引用了创建它的Boggle
实例。 (如果它被标记为static
,则情况并非如此。)如果您想创建与另一个实例关联的timesUP
实例,您可以执行以下操作:
otherBoggle.new timesUp();
这是非常奇怪的语法,诚然::)
这并不能解决Midhat确定的问题 - 但这意味着您不必担心获得对外部类的引用。只需在endGame()
内拨打timesUP.run()
,就会在相应的实例上调用它。
答案 1 :(得分:0)
您在线程中有阻止控制台输入。运行时间将由此决定。您可以在单独的线程中输入控制台,并在当前线程中添加一个计时器以在一分钟后终止输入线程,并调用this.endGame()