Stampa "ciao mondo" ogni X secondi


127

Ultimamente ho usato loop con grandi numeri per stampare 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++;
}

Capisco che questo è un modo molto sciocco per farlo, ma non ho mai usato nessuna libreria di timer in Java. Come si modifica quanto sopra per stampare ogni 3 secondi?


1
Mentre le risposte di seguito dovrebbero ovviamente rispondere alla tua domanda, dovresti anche notare che il modo in cui lo fai comporterebbe un intervallo diverso su ogni macchina. Dipende da quanto velocemente può eseguire il compilatore.
IHazABone,

Risposte:


187

Puoi anche dare un'occhiata Timere TimerTaskclassi che puoi utilizzare per pianificare l'esecuzione ndell'attività ogni secondo.

È necessaria una classe che estende TimerTaske sovrascrive il public void run()metodo, che verrà eseguito ogni volta che si passa un'istanza di quella classe al timer.schedule()metodo.

Ecco un esempio, che stampa Hello Worldogni 5 secondi: -

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

9
Si noti che il schedulemetodo 2-param verrà eseguito una volta dopo il ritardo specificato. Il 3-param scheduleo scheduleAtFixedRatedovrebbe essere usato.
Tim Bender,

2
lol, si. A volte ottengo voti positivi sulle risposte e vado a cercare che la mia comprensione è migliorata dall'ultima volta che ho confuso fornendo una soluzione.
Tim Bender,

4
@TimBender Mi chiedo solo se OP ha davvero svolto il suo compito con questo;) Comunque, ora preferirei usare ExecutorServiceper questi compiti. Questo è davvero un grande miglioramento rispetto all'API Thread tradizionale. Non l'ho usato al momento della risposta.
Rohit Jain,

4
Timer timer = new Timer(true);dovrebbe essere impostato truecome un demone. A meno che non si desideri che il timer sia ancora in esecuzione dopo aver chiuso l'applicazione.
Tomasz Mularczyk,

Questo mi ha aiutato finalmente a farmi capire anche i timer. + 1. Continuate così!
Daniel Tork,

197

Se si desidera eseguire un'attività periodica, utilizzare a ScheduledExecutorService. Specificamente ScheduledExecutorService.scheduleAtFixedRate

Il codice:

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

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 3, TimeUnit.SECONDS);

10
Spero che anche qualcun altro abbia votato. Thread.sleep () potrebbe adattarsi meglio al codice nell'OP, ma è una reinvenzione piuttosto amatoriale della ruota. Gli ingegneri software professionisti utilizzeranno API collaudate e affidabili, come TimerTask. Tuttavia, ScheduledExecutorService è ancora migliore; fare riferimento alla concorrenza Java in pratica di Brian Goetz et al . Quest'ultima classe è in circolazione da quasi un decennio: è triste che tutte queste altre risposte la trascurino.
Michael Scheper,

2
@MichaelScheper, Grazie, sono felice di vedere che questa risposta ha finalmente superato la TimerTaskvariante. È interessante notare che ho notato che la risposta accettata in realtà non è corretta: \ L'età delle due API a parte, ScheduledExecutorServiceè semplicemente più intuitivamente dichiarativa. L'uso di TimeUnitcome parametro rende molto più chiaro ciò che sta accadendo. Sono finiti i giorni del codice come 5*60*1000 // 5 minutes.
Tim Bender,

2
@TimBender Ho notato che hai un 3 per l'argomento periodo. Non riesco a capire se si tratta di secondi o millisecondi. Vorrei farlo funzionare ogni 500 millisecondi (mezzo secondo).
John Merlino,

2
Ah! Capisco. Il quarto argomento consente di specificare l'ora, ad esempio TimeUnit.MILLISECONDS.
John Merlino,

1
@TerryCarter In Java8 + Puoi invece fare ciò Runnable helloRunnable = () -> { /*code */ };che è ancora più bello;)
Joel

39

Prova a fare questo:

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

Questo codice verrà eseguito per stampare su Hello World ogni 5000 millisecondi ( 5 secondi). Per maggiori informazioni, leggi https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html


16

Lo capisco con un timer, spero che aiuti. Ho usato un timer da java.util.Timere TimerTaskper lo stesso pacchetto. Vedi sotto:

TimerTask task = new TimerTask() {

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

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

10

Puoi usare Thread.sleep(3000)inside per loop.

Nota: questo richiederà un try/catchblocco.


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

viene creato un ciclo infinito L'attività di pianificazione annunci è configurata.


4

Il modo più semplice sarebbe impostare il thread principale su 3000 millisecondi (3 secondi):

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!"):
}

Ciò interromperà il thread di almeno X millisecondi. Il thread potrebbe dormire più tempo, ma dipende dalla JVM. L'unica cosa garantita è che il thread dormirà almeno quei millisecondi. Dai un'occhiata aThread#sleep documento:

Fa in modo che il thread attualmente in esecuzione venga sospeso (interrompa temporaneamente l'esecuzione) per il numero specificato di millisecondi, soggetto alla precisione e all'accuratezza dei timer e degli scheduler del sistema .


Grazie @Luiggi. Java si assicurerà sempre che siano 3000 ms, indipendentemente dalla macchina (CPU) su cui lo eseguo, giusto?
Meiryo,

@NandkumarTekale ti interessa elaborare di più?
Meiryo,

4
@meiryo Arresterà il thread almeno X millisecondi. Il thread potrebbe dormire più tempo, ma dipende dalla JVM. L'unica cosa garantita è che il thread dormirà almeno quei millisecondi.
Luiggi Mendoza,

4
Avvertenza: se questo non è un sistema in tempo reale, il sonno sarà di almeno 3000 ms, ma potrebbe essere più lungo. Se vuoi dormire esattamente 3000 ms, specialmente dove la vita umana è a rischio (strumenti medici, controllo di aerei, ecc.), Dovresti usare un sistema operativo in tempo reale.
Kinjal Dixit,

1
@meiryo: Luiggi e Kinjal hanno spiegato molto bene :)
Nandkumar Tekale,

3

L'uso java.util.Timere il Timer#schedule(TimerTask,delay,period)metodo ti aiuteranno.

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

2

Questo è il modo semplice di usare il thread in 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!");
}

1

Cosa ha detto. Puoi gestire le eccezioni come preferisci, ma Thread.sleep (millisecondi); è il percorso migliore da prendere.

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

1

Ecco un altro modo semplice utilizzando l'interfaccia Runnable in 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();
    }
}


-1

Per piccole applicazioni è bene usare Timer e TimerTask come indicato da Rohit, ma nelle applicazioni Web utilizzerei Quartz Scheduler per pianificare lavori ed eseguire tali lavori periodici.

Vedi tutorial per la programmazione al quarzo.


-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();
    }
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.