Search code examples
javacountdown

Java - Countdown timer without GUI


Basically I am making a text based "game" (Not so much a game, more of a way to improve basic java skills and logic). However, as part of it I wish to have a timer. It would count down on the time I wish from the variable to 0. Now, I have seen a few ways to do this with a gui, however, is there a way to do this without a gui/jframe etc.

So, what I am wondering is. Can you make a count down from x to 0 without using a gui/jframe. If so, how would you go about this?

Thanks, once I have some ideas will edit with progress.

Edit

// Start timer
Runnable r = new TimerEg(gameLength);
new Thread(r).start();

Above is how I am calling the thread/timer

public static void main(int count) {

If I then have this in the TimerEg class, the timer complies. However, when compiling the main in the other thread I get.

Error

Now, am I completely miss-understanding threads and how this would work? Or is there something I am missing?

Error:

constructor TimerEg in class TimerEg cannot be applied to given types;
required: no arguments; found int; reason: actual and formal arguments differ in length

Found on line Runnable r = new TimerEg(gameLength);


Solution

  • Same as with a GUI, you'd use a Timer, but here instead of using a Swing Timer, you'd use a java.util.Timer. Have a look at the Timer API for the details. Also have a look at the TimerTask API since you would use this in conjunction with your Timer.

    For example:

    import java.util.Timer;
    import java.util.TimerTask;
    
    public class TimerEg {
       private static TimerTask myTask = null;
       public static void main(String[] args) {
          Timer timer = new Timer("My Timer", false);
          int count = 10;
          myTask = new MyTimerTask(count, new Runnable() {
             public void run() {
                System.exit(0);
             }
          });
    
          long delay = 1000L;
          timer.scheduleAtFixedRate(myTask, delay, delay);
       }
    }
    
    class MyTimerTask extends TimerTask {
       private int count;
       private Runnable doWhenDone;
    
       public MyTimerTask(int count, Runnable doWhenDone) {
          this.count = count;
          this.doWhenDone = doWhenDone;
       }
    
       @Override
       public void run() {
          count--;
          System.out.println("Count is: " + count);
          if (count == 0) {
             cancel();
             doWhenDone.run();
          }
       }
    
    }