Java中的重复倒数计时器

时间:2011-09-19 15:28:39

标签: java timer countdown

我正在尝试将倒数计时器应用到预先存在的公共课程中,我有几个问题。

概述:我希望程序中的计时器在程序初始化后从60(秒)开始倒计时。

如果计时器到达零,则程序退出。

如果用户在60秒的时间范围内满足某些参数,则计时器将重置为60,显示一组新参数,并再次开始倒计时。它应该能够无限次地执行此操作,直到用户在60秒内无法满足参数。

定时器也会有某种(TBD)GUI表示,很可能是数字倒计时或JProgressBar。

我是半新人(约3个月)编程,自学成才,还是学习很多(所以要温柔):)

我的问题是:

  1. 实施此方法的最佳方式是什么?

  2. 我认为这需要在一个帖子中运行?

  3. 计时器是否可以轻松配置? (不重要,只是有趣)

  4. 感谢您的帮助。如果你需要查看代码,我可以找到一些。

    编辑:只是为了澄清/背景: 这是一个定时赛车视频游戏,我正在努力发展我作为程序员的技能。这个想法是玩家有60秒完成一圈。如果玩家完成一圈成功,则计时器重置为60秒并且轨道变得稍微困难​​。由于困难,游戏一直持续到玩家无法在60秒内完成一圈。游戏将圈数记录为高分,并向玩家询问他们是否想再试一次。

5 个答案:

答案 0 :(得分:1)

如果我是你,我会使用:

  1. 一个AtomicInteger变量,它将保持当前的倒计时值;
  2. 一个定时器线程,它会唤醒每1s和decrementAndGet()变量,将结果与零进行比较并在结果为零时终止应用程序;
  3. (可能)一个线程也会每1秒唤醒一次以重新绘制GUI - 这里最好的方法取决于你的GUI框架。
  4. 最后,每当您需要将计数重置为60秒时,您只需从任何线程中调用set(newValue)

    计时器线程的run()方法可以简单如下:

    for (;;) {
      if (counter.decrementAndGet() <= 0) {
        // TODO: exit the app
      }
      Thread.sleep(1000);
    }
    

    我认为比试图管理多个Timer对象要容易得多。

答案 1 :(得分:0)

在应用程序中实现计时器的最佳方法是使用一些调度程序框架,如Quartz

答案 2 :(得分:0)

您可以使用java.util.Timer来安排方法的执行,然后在满足要求时取消它。

像这样:

timer = new Timer();
timer.schedule(new Task(), 60 * 1000);

然后创建一个这样的类来处理timerschedule:

class Task extends TimerTask {
    public void run() {
      System.exit(0);
    }
  }

如果满足要求,则执行此操作以阻止其执行:

timer.cancel();

答案 3 :(得分:0)

如果您需要更好地更新GUI以使用SwingWorker http://en.wikipedia.org/wiki/SwingWorker 我会写这样的东西:

SwingWorker<String, Integer> timer = new SwingWorker<String, Integer>() {
    Integer timer=60;
    @Override
    protected String doInBackground() throws Exception {
      //update guiModel
      //label.setText(timer.toString());
        while(timer>0){
        Thread.sleep(1000);
        timer--;
        }
        return null;
    }
    @Override
     public void done(){
         System.exit(0);
     } 
};

JButton restart = new JButton(){
    {
  addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                timer.cancel(true);
                timer.execute();
            }
        });      
    }
};

答案 4 :(得分:0)

我知道这是一个太老的问题了,但是为了那些可能偶然发现这个问题并面临相同挑战的人。

这对我来说很完美

        int time = 1800; //30 minutes
        Thread clock = new Thread(){
            public void run(){
                for(;;){
                    try {
                        Thread.sleep(1000); //Sleeps for 1 second
                        time -= 1; //Reduce time by 1 every second
                        lblCount.setText(String.valueOf(time)); //Label to print the value to
                        if (time == 300) {
                            new Warning().setVisible(true); //Another interface to display when the time remains 5 mins
                        } else if (time == 0) {
                            new Login().setVisible(true); //Display login interface when timer reaches zero
                            dispose(); //Close current interface
                        }
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Counter.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        };
        clock.start();