Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swing timer persistence after main method finishes

Tags:

java

timer

swing

I am trying to create a program to perform a simple task and produce an output every x seconds. I also want the program to run until I decide to manually close the program.

I have been attempting to implement this using a Swing timer, as I believe this is the best way. The problem is I'm not sure how to keep the program going once the main method has finished executing. So for example I have:

 static ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          try {
            //do stuff
        } catch (Exception e) {
            e.printStackTrace();
        }
          }
  };
public static void main(String[] args) throws Exception{
      Timer timer = new Timer(3000, taskPerformer);
      timer.start();
  }

which just finishes execution immediately. I can dodge the problem by putting the current thread of execution to sleep Thread.currentThread().sleep(..), but this feels like a botch job, and will be ultimately be finite in duration. I can also do while(true), but I believe this is bad practice.

My question is how to get the desired persistence behavior, and if there is a better way than using Swing timers.

Thanks.

like image 375
Wozza Avatar asked Oct 03 '11 22:10

Wozza


2 Answers

A Swing Timer will stay alive as long as the EDT is alive, usually this is done by having a Swing GUI present and visible (this creates a non-daemon thread that persists until the GUI exits). If you don't need a Swing GUI, then don't use a Swing Timer. Perhaps instead use a java.util.Timer, and don't exit the main method til you give the word (however you plan to do that).

like image 126
Hovercraft Full Of Eels Avatar answered Oct 25 '22 18:10

Hovercraft Full Of Eels


Use java.util.Timer instead. The associated thread will not run as a daemon.

like image 40
Michał Šrajer Avatar answered Oct 25 '22 18:10

Michał Šrajer