Ejecute una función java después de un número específico de segundos

5 minutos de lectura

avatar de usuario de ufk
ufk

Tengo una función específica que quiero que se ejecute después de 5 segundos. ¿Cómo puedo hacer eso en Java?

Encontré javax.swing.timer, pero realmente no puedo entender cómo usarlo. Parece que estoy buscando algo mucho más simple que lo que ofrece esta clase.

Agregue un ejemplo de uso simple.

  • ¿Quieres esperar 5 segundos y luego ejecutar algo o quieres seguir haciendo otra cosa en los 5 segundos?

    – whiskysierra

    13 de febrero de 2010 a las 15:38

  • quiero seguir haciendo otra cosa

    – ufk

    13 de febrero de 2010 a las 15:40

avatar de usuario de tangens
tangens

new java.util.Timer().schedule( 
        new java.util.TimerTask() {
            @Override
            public void run() {
                // your code here
            }
        }, 
        5000 
);

EDITAR:

javadoc dice:

Una vez que desaparece la última referencia en vivo a un objeto Timer y todas las tareas pendientes han completado la ejecución, el subproceso de ejecución de la tarea del temporizador finaliza correctamente (y queda sujeto a la recolección de elementos no utilizados). Sin embargo, esto puede tardar arbitrariamente en ocurrir.

  • Si ejecuta ese código, perderá hilos. Asegúrate de limpiar el temporizador cuando hayas terminado.

    – Skaffman

    13 de febrero de 2010 a las 15:40

  • @skaffman: agregué una declaración del javadoc. ¿Realmente tienes que limpiar después del horario de llamadas?

    – tangens

    13 de febrero de 2010 a las 15:47

  • Podría estar bien, pero luego podría no estarlo. Si ejecuta ese fragmento de código varias veces, tendrá hilos sueltos dando vueltas sin forma de ordenarlos.

    – Skaffman

    13 de febrero de 2010 a las 15:51

  • import java.util.Timer; import java.util.TimerTask; podría hacer más obvio que esto no es javax.swing.Timer. / Tenga en cuenta que si está utilizando Swing (y, en realidad, AWT), no debería hacer nada para cambiar componentes en subprocesos que no son EDT (Event Dispatch Thread) (java.util.Timer tareas malas; javax.swing.Timer buenas acciones).

    – Tom Hawtin – tachuela

    13 de febrero de 2010 a las 19:08

  • @PaulAlexander De acuerdo con los documentos: llamar al temporizador cancel El método al final del método de ejecución aclararía el hilo de ejecución de TimerTasks.

    – dandalf

    24 de febrero de 2018 a las 21:59


avatar de usuario de skaffman
skaffman

Algo como esto:

// When your program starts up
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

// then, when you want to schedule a task
Runnable task = ....    
executor.schedule(task, 5, TimeUnit.SECONDS);

// and finally, when your program wants to exit
executor.shutdown();

Hay varios otros métodos de fábrica en Executor que puede usar en su lugar, si desea más subprocesos en el grupo.

Y recuerda, es importante apagar el ejecutor cuando hayas terminado. Él shutdown() El método cerrará limpiamente el grupo de subprocesos cuando se haya completado la última tarea y se bloqueará hasta que esto suceda. shutdownNow() terminará el grupo de subprocesos inmediatamente.

  • shutdown() no bloquea awaitTermination() lo hace.

    – Yonas

    19 de mayo de 2021 a las 11:04

  • shutdown() simplemente no permite que se envíen nuevas tareas. shutdownNow() también interrumpe las tareas (no necesariamente terminando inmediatamente).

    – dan1st

    25 de junio de 2021 a las 8:19

Ejemplo de uso javax.swing.Timer

Timer timer = new Timer(3000, new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent arg0) {
    // Code to be executed
  }
});
timer.setRepeats(false); // Only execute once
timer.start(); // Go go go!

Este código solo se ejecutará una vez, y la ejecución ocurre en 3000 ms (3 segundos).

Como menciona camickr, debe buscar “Cómo usar temporizadores de oscilación” para una breve introducción.

  • Sólo eso ¡Ve, ve, ve! 🙂

    – Farshid Ahmadi

    17 de diciembre de 2020 a las 13:05

  • ¡trabajado como un encanto! Creo que esta es la forma más eficiente.

    – Noor Hossain

    10 oct 2021 a las 17:12

  • no funcionó para mí

    – Sayed Hussainullah Sadat

    10 de noviembre a las 10:29

Avatar de usuario de Dandalf
Dandalf

Como una variación de la respuesta de @tangens: si no puede esperar a que el recolector de basura limpie su hilo, cancele el temporizador al final de su método de ejecución.

Timer t = new java.util.Timer();
t.schedule( 
        new java.util.TimerTask() {
            @Override
            public void run() {
                // your code here
                // close the thread
                t.cancel();
            }
        }, 
        5000 
);

avatar de usuario de user2885850
usuario2885850

Mi código es el siguiente:

new java.util.Timer().schedule(

    new java.util.TimerTask() {
        @Override
        public void run() {
            // your code here, and if you have to refresh UI put this code: 
           runOnUiThread(new   Runnable() {
                  public void run() {
                            //your code

                        }
                   });
        }
    }, 
    5000 
);

avatar de usuario de camickr
camickr

Su pregunta original menciona el “Temporizador de giro”. Si, de hecho, su pregunta está relacionada con SWing, entonces debería usar el temporizador de oscilación y NO el util.Timer.

Lea la sección del tutorial de Swing sobre “Cómo usar temporizadores” para más información.

avatar de usuario de birgersp
birgersp

podrías usar la función Thread.Sleep()

Thread.sleep(4000);
myfunction();

Su función se ejecutará después de 4 segundos. Sin embargo, esto podría pausar todo el programa…

  • ¡Y solo garantiza que la ejecución se ejecutará después de 4 segundos, lo que podría significar también después de 10 segundos!

    – questzen

    13 de febrero de 2010 a las 22:28

  • questzen, encontrarás que todos los métodos aquí hacen eso. De hecho, incluso si está programando algo a nivel del sistema operativo, generalmente solo puede garantizar un tiempo mínimo transcurrido antes de un evento.

    – Ethan

    21 de marzo de 2013 a las 5:19

  • Esta no es la pregunta real

    – Inder R. Singh

    16 jun 2017 a las 18:35

  • Solo tuve que darle un voto negativo a esto, en absoluto una respuesta a la pregunta en cuestión.

    – el Mayer

    24 de julio de 2018 a las 19:10

  • OP dijo en un comentario “quiero seguir haciendo otra cosa”; este código, obviamente, no lo hace.

    – Abhijit Sarkar

    2 de marzo de 2019 a las 21:14


¿Ha sido útil esta solución?