Persistencia del temporizador de oscilación después de que termine el método principal

stoy tratando de crear un programa para realizar una tarea simple y producir una salida cadax segundos. También quiero que el programa se ejecute hasta que decida cerrarlo manualmente.

He intentado implementar esto usando un temporizador Swing, ya que creo que esta es la mejor manera. El problema es que no estoy seguro de cómo mantener el programa una vez que el método principal ha terminado de ejecutarse. Entonces, por ejemplo, tengo:

 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();
  }

que acaba de finalizar la ejecución de inmediato. Puedo esquivar el problema poniendo el hilo de ejecución actual a dormirThread.currentThread().sleep(..), pero esto se siente como un trabajo fallido y, en última instancia, tendrá una duración limitada. También puedo hacerlo mientras (cierto), pero creo que esta es una mala práctica.

Mi pregunta es cómo obtener el comportamiento de persistencia deseado, y si hay una mejor manera que usar temporizadores Swing.

Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta