【问题标题】:java timer on current instance当前实例上的java计时器
【发布时间】:2010-03-29 06:44:54
【问题描述】:
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();

    }
}

我有上面的类,它应该在给定的时间长度内执行一个循环,然后调用一个实例方法。本质上,在当前实例上调用 endGame() 之前,我需要 newGame() 中的循环运行一分钟左右。但是,使用 Timer 类我不确定如何在当前实例上调用我需要的方法,因为我无法将任何参数传递给 timertasks 运行方法?

有没有一种简单的方法可以做到这一点,还是我用错了方法? (注意:这只是一个控制台项目,没有 GUI)

===========

代码编辑

我已按照建议将代码更改为上述代码,它几乎可以按我的预期工作,但是线程似乎仍然没有正确结束。我是while循环会死,控制最终会回到主要方法。有什么想法吗?

【问题讨论】:

    标签: java timer boggle


    【解决方案1】:

    因为timesUP(请改名!)是一个内部类,它已经引用了创建它的Boggle 的实例。 (如果它被标记为static,则不会出现这种情况。)如果您想创建一个与另一个实例关联的timesUP 实例,您可以执行以下操作:

    otherBoggle.new timesUp();
    

    这是相当奇怪的语法,诚然:)

    诚然,这并不能解决 Midhat 发现的问题 - 但这意味着您无需担心获取对外部类的引用。只需从timesUP.run() 中调用endGame(),它就会在适当的实例上调用它。

    【讨论】:

    • 啊,没有实现内部类继承引用。我对 Midhat 所指的问题有点困惑,你能澄清一下吗?
    • @hspim:嗯,定时器在一个执行线程上被调用——但你仍然在主线程的while (true)循环中。你可以让endGame() 存储一个“我完成了”的标志,并更改你的while循环以在更改时停止......尽管你仍然需要等待玩家完成他们当前的猜测。
    • 尝试使用布尔值来实现这一点,但它似乎并没有结束 while 循环。将上面的代码编辑为当前格式。有什么建议吗?
    • @hspim:试着让它变得易变——目前你在线程之间没有任何同步。不要忘记将 active 设置为 false 不会停止 nextLine() 调用 - 你仍然需要等待玩家点击返回。
    【解决方案2】:

    您在线程中有阻塞控制台输入。运行时间将由此决定。您可以在单独的线程中拥有控制台输入,并在当前线程中添加一个计时器以在一分钟后终止输入线程,然后调用 this.endGame()

    【讨论】:

    • 计时器已经在另一个线程中运行。我相信当前代码实际上会在显示现有猜测方面起作用(当timesUP.run() 调用endGame() 时,虽然它不会完全关闭。它也没有解决从添加的一个线程显示的线程安全问题别人的猜测。
    • 你说得对。 endGame() 被调用,但程序没有像我预期的那样退出。不过我不熟悉线程,你能告诉我我从这里去哪里吗?
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多