Imprime "hola mundo" cada X segundos

127

Últimamente he estado usando bucles con números grandes para imprimir Hello World:

int counter = 0;

while(true) {
    //loop for ~5 seconds
    for(int i = 0; i < 2147483647 ; i++) {
        //another loop because it's 2012 and PCs have gotten considerably faster :)
        for(int j = 0; j < 2147483647 ; j++){ ... }
    }
    System.out.println(counter + ". Hello World!");
    counter++;
}

Entiendo que esta es una forma muy tonta de hacerlo, pero nunca he usado ninguna biblioteca de temporizadores en Java todavía. ¿Cómo se modificaría lo anterior para imprimir cada 3 segundos, por ejemplo?

meiryo
fuente
1
Si bien las respuestas a continuación obviamente deberían responder a su pregunta, también debe tener en cuenta que la forma en que lo hace daría lugar a un intervalo diferente en cada máquina. Depende de qué tan rápido pueda ejecutar el compilador.
IHazABone
Posible duplicado de Llamar a una función cada 10 minutos
Alex.K.

Respuestas:

187

También puede echar un vistazo a Timery TimerTaskclases que se pueden utilizar para programar su tarea para ejecutar cada nsegundo.

Necesita una clase que amplíe TimerTasky anule el public void run()método, que se ejecutará cada vez que pase una instancia de esa clase al timer.schedule()método.

Aquí hay un ejemplo, que imprime Hello Worldcada 5 segundos: -

class SayHello extends TimerTask {
    public void run() {
       System.out.println("Hello World!"); 
    }
}

// And From your main() method or any other method
Timer timer = new Timer();
timer.schedule(new SayHello(), 0, 5000);
Rohit Jain
fuente
9
Tenga en cuenta que el schedulemétodo de 2 parámetros se ejecutará una vez después del retraso especificado. El 3-param scheduleo scheduleAtFixedRatenecesitaría ser usado.
Tim Bender
2
LOL sí. A veces obtengo votos positivos en las respuestas y busco para encontrar que mi propia comprensión ha mejorado desde la última vez que me equivoqué al proporcionar una solución.
Tim Bender
44
@TimBender Solo me pregunto si OP realmente hizo su tarea con esto;) De todos modos, ahora preferiría usar ExecutorServicepara estas tareas. Esa es realmente una gran mejora con respecto a la API Thread tradicional. Simplemente no lo usé al momento de responder.
Rohit Jain
44
Timer timer = new Timer(true);debe establecerse truecomo un demonio. A menos que desee que el temporizador siga ejecutándose después de cerrar la aplicación.
Tomasz Mularczyk
Esto finalmente me ayudó a comprender los temporizadores también. + 1. ¡Sigan con el buen trabajo!
Daniel Tork
197

Si desea hacer una tarea periódica, use a ScheduledExecutorService. Específicamente ScheduledExecutorService.scheduleAtFixedRate

El código:

Runnable helloRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello world");
    }
};

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 3, TimeUnit.SECONDS);
Tim Bender
fuente
10
Espero que alguien más lo haya votado también. Thread.sleep () podría encajar mejor en el código del OP, pero es una reinvención bastante aficionada de la rueda. Los ingenieros de software profesionales utilizarán API probadas y confiables, como TimerTask. Sin embargo, ScheduledExecutorService es aún mejor; consulte la concurrencia de Java en la práctica de Brian Goetz et al . La última clase ha existido durante casi una década; es triste que todas estas otras respuestas la pasen por alto.
Michael Scheper
2
@MichaelScheper, gracias, me alegra ver que esta respuesta finalmente ha superado la TimerTaskvariante. Curiosamente, noté que la respuesta aceptada en realidad no es correcta: \ La edad de las dos API a un lado, ScheduledExecutorServicees simplemente más intuitiva y declarativa. El uso de TimeUnitcomo parámetro deja mucho más claro lo que está ocurriendo. Atrás quedaron los días de código como 5*60*1000 // 5 minutes.
Tim Bender
2
@TimBender Noté que tienes un 3 para el argumento de período. No puedo encontrar si eso es en segundos o milisegundos. Me gustaría que se ejecute cada 500 milisegundos (medio segundo).
JohnMerlino
2
Ahh ya veo. El cuarto argumento le permite especificar el tiempo, por ejemplo, TimeUnit.MILLISECONDS.
JohnMerlino
1
@TerryCarter En Java8 + Puedes hacer lo Runnable helloRunnable = () -> { /*code */ };que es aún más hermoso;)
Joel
39

Intenta hacer esto:

Timer t = new Timer();
t.schedule(new TimerTask() {
    @Override
    public void run() {
       System.out.println("Hello World");
    }
}, 0, 5000);

Este código ejecutará print para consolar Hello World cada 5000 milisegundos ( 5 segundos). Para obtener más información, lea https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html


fuente
16

Lo resuelvo con un temporizador, espero que ayude. He usado un temporizador desde java.util.Timery TimerTaskdesde el mismo paquete. Vea abajo:

TimerTask task = new TimerTask() {

    @Override
    public void run() {
        System.out.println("Hello World");
    }
};

Timer timer = new Timer();
timer.schedule(task, new Date(), 3000);
tmwanik
fuente
10

Puedes usar Thread.sleep(3000)dentro para loop.

Nota: Esto requerirá un try/catchbloqueo.

saum22
fuente
6
public class HelloWorld extends TimerTask{

    public void run() {

        System.out.println("Hello World");
    }
}


public class PrintHelloWorld {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new HelloWorld(), 0, 5000);

        while (true) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("InterruptedException Exception" + e.getMessage());
            }
        }
    }
}

se crea un bucle infinito y se configura la tarea del planificador de anuncios.

Vicky
fuente
4

La forma más fácil sería configurar el hilo principal para que duerma 3000 milisegundos (3 segundos):

for(int i = 0; i< 10; i++) {
    try {
        //sending the actual Thread of execution to sleep X milliseconds
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
    System.out.println("Hello world!"):
}

Esto detendrá el hilo al menos X milisegundos. El hilo podría estar durmiendo más tiempo, pero eso depende de la JVM. Lo único garantizado es que el hilo dormirá al menos esos milisegundos. Echa un vistazo al Thread#sleepdocumento:

Hace que el subproceso que se está ejecutando actualmente se suspenda (cesa temporalmente la ejecución) durante el número especificado de milisegundos, sujeto a la precisión y exactitud de los temporizadores y programadores del sistema .

Luiggi Mendoza
fuente
Gracias @Luiggi. Java siempre se asegurará de que sean 3000 ms sin importar en qué máquina (CPU) lo ejecute, ¿verdad?
meiryo
@NandkumarTekale ¿quieres elaborar más?
meiryo
44
@meiryo Se detendrá el hilo al menos X milisegundos. El hilo podría estar durmiendo más tiempo, pero eso depende de la JVM. Lo único garantizado es que el hilo dormirá al menos esos milisegundos.
Luiggi Mendoza
44
Advertencia: si este no es un sistema en tiempo real, el sueño será de al menos 3000 ms, pero podría ser más largo. Si desea dormir exactamente 3000 ms, especialmente donde la vida humana está en riesgo (instrumentos médicos, aviones de control, etc.), debe usar un sistema operativo en tiempo real.
Kinjal Dixit
1
@meiryo: Luiggi y kinjal explicaron muy bien :)
Nandkumar Tekale
3

El uso java.util.Timery el Timer#schedule(TimerTask,delay,period)método te ayudarán.

public class RemindTask extends TimerTask {
    public void run() {
      System.out.println(" Hello World!");
    }
    public static void main(String[] args){
       Timer timer = new Timer();
       timer.schedule(new RemindTask(), 3000,3000);
    }
  }
Subhrajyoti Majumder
fuente
2

Esta es la forma simple de usar hilo en java:

for(int i = 0; i< 10; i++) {
    try {
        //sending the actual Thread of execution to sleep X milliseconds
        Thread.sleep(3000);
    } catch(Exception e) {
        System.out.println("Exception : "+e.getMessage());
    }
    System.out.println("Hello world!");
}
usuario3928455
fuente
1

Lo que dijo. Puede manejar las excepciones como quiera, pero Thread.sleep (milisegundos); Es la mejor ruta a seguir.

public static void main(String[] args) throws InterruptedException {
leigero
fuente
1

Aquí hay otra forma simple de usar la interfaz Runnable en Thread Constructor

public class Demo {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T1 : "+i);
                }
            }
        });

        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++) {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T2 : "+i);
                }
            }
        });

        Thread t3 = new Thread(new Runnable() {

            @Override
            public void run() {
                for(int i = 0; i < 5; i++){
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Thread T3 : "+i);
                }
            }
        });

        t1.start();
        t2.start();
        t3.start();
    }
}
Mayur Chudasama
fuente
0

Añadir Thread.sleep

try {
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
Russell Gutiérrez
fuente
-1

Para aplicaciones pequeñas está bien usar Timer y TimerTask como mencionó Rohit, pero en aplicaciones web usaría Quartz Scheduler para programar trabajos y realizar dichos trabajos periódicos.

Ver tutoriales para la programación de cuarzo.

Nandkumar Tekale
fuente
-1
public class TimeDelay{
  public static void main(String args[]) {
    try {
      while (true) {
        System.out.println(new String("Hello world"));
        Thread.sleep(3 * 1000); // every 3 seconds
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}
usuario3017805
fuente