How to handle Timers correctly in Java?

15,881

Solution 1

As already mentioned, it's better to use java.util.Timer, but you can also use setRepeats() before starting:

timer.setRepeats(false);

Solution 2

Don't neglect to use the event dispatch thread. There's nothing wrong with java.util.Timer, but javax.swing.Timer has several advantages with Swing.

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Timer;

public class X {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ActionListener actionListener = new ActionListener() {

                    public void actionPerformed(ActionEvent actionEvent) {
                        System.out.println("Hello");
                    }
                };
                Timer timer = new Timer(5000, actionListener);
                timer.start();
            }
        });
    }
}

If using java.util.Timer, update the GUI using a continuation.

Solution 3

Sounds like you want a java.util.Timer rather than a javax.swing.Timer.

Solution 4

class MyTask extends TimerTask {
    public void run() {
      System.out.println("Hello");

    }
  }

and then

timer = new Timer();
timer.schedule(new MyTask(), 5000);
Share:
15,881
Rama
Author by

Rama

Updated on June 14, 2022

Comments

  • Rama
    Rama almost 2 years

    I want my timer to execute the actionPerformed method only one time once it 5 seconds the time but it is writing in the console "Hello" lots of times:

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.Timer;
    
    public class X{
        public static void main(String args[]) {
    
            ActionListener actionListener = new ActionListener() {
                public void actionPerformed(ActionEvent actionEvent) {
                    System.out.println( "Hello" );
                }
            };
            Timer timer = new Timer( 5000, actionListener );
            timer.start();
        }
    }
    

    How can I make the effect I want? Thanks