2010-03-29 3 views
0
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?java таймер на текущий экземпляр

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

==========

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

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

ответ

1

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

otherBoggle.new timesUp(); 

Это довольно странно, синтаксис, по общему признанию, :)

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

+0

Ах, не понимал, что внутренние классы наследуют ссылку. Я немного смущен проблемой, которую Мидхат имеет в виду, хотя, не могли бы вы уточнить? – hspim

+0

@hspim: Ну, таймер вызывается в одном потоке исполнения, re все еще в цикле 'while (true)' в основном потоке. Вы можете сделать 'endGame()' хранить флаг, говорящий «Я сделан», и изменить цикл while, чтобы остановить, когда это было изменено ... хотя вы, все равно придется ждать, пока игрок закончит свое текущее предположение. –

+0

попытался использовать логическое значение для достижения этого, но он, похоже, не закончил цикл while. отредактировал приведенный выше код в его текущем формате. любой совет? – hspim

0

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

+0

Таймер уже работает в другом потоке. Я считаю, что текущий код действительно будет работать с точки зрения отображения существующих догадок (когда 'timesUP.run()' вызывает 'endGame()', хотя он не будет закрываться чисто, а также не отвечает безопасности потоков отображение из одного потока с добавлением догадок из другого. –

+0

А ты права. endGame() вызывается, но программа не выходит, как я ожидал. Я не знаком с потоками, не могли бы вы дать мне подсказку, куда я иду? – hspim

Смежные вопросы