Imprimez «bonjour le monde» toutes les X secondes


127

Dernièrement, j'ai utilisé des boucles avec de grands nombres pour imprimer 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++;
}

Je comprends que c'est une façon très idiote de le faire, mais je n'ai encore jamais utilisé de bibliothèques de minuterie en Java. Comment modifierait-on ce qui précède pour imprimer toutes les 3 secondes?


1
Bien que les réponses ci-dessous devraient évidemment répondre à votre question, vous devez également noter que la façon dont vous le faites entraînerait un intervalle différent sur chaque machine. Dépend de la vitesse à laquelle il peut exécuter le compilateur.
IHazABone

Réponses:


187

Vous pouvez également jeter un oeil à Timeret les TimerTaskclasses que vous pouvez utiliser pour planifier votre tâche à exécuter toutes les nsecondes.

Vous avez besoin d'une classe qui étend TimerTasket remplace la public void run()méthode, qui sera exécutée chaque fois que vous transmettez une instance de cette classe à timer.schedule()method.

Voici un exemple, qui s'imprime Hello Worldtoutes les 5 secondes: -

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
Notez que la scheduleméthode à 2 paramètres s'exécutera une fois après le délai spécifié. Le paramètre 3 scheduleou scheduleAtFixedRatedevrait être utilisé.
Tim Bender

2
MDR ouais. Parfois, je reçois des votes positifs sur les réponses et je cherche à constater que ma propre compréhension s'est améliorée depuis la dernière fois que je me suis embrouillé en fournissant une solution.
Tim Bender

4
@TimBender Je me demande simplement si OP a vraiment accompli sa tâche avec ça;) Quoi qu'il en soit, maintenant je préférerais l'utiliser ExecutorServicepour ces tâches. C'est vraiment une grande amélioration par rapport à l'API Thread traditionnelle. Je ne l'ai simplement pas utilisé au moment de répondre.
Rohit Jain

4
Timer timer = new Timer(true);devrait être défini truecomme un démon. Sauf si vous souhaitez que le minuteur fonctionne toujours après la fermeture de l'application.
Tomasz Mularczyk

Cela m'a aussi aidé à comprendre les minuteries + 1. Continuez votre bon travail!
Daniel Tork

197

Si vous souhaitez effectuer une tâche périodique, utilisez un fichier ScheduledExecutorService. Spécifiquement ScheduledExecutorService.scheduleAtFixedRate

Le code:

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
J'espère que quelqu'un d'autre votera également pour cela. Thread.sleep () pourrait correspondre le mieux au code dans l'OP, mais c'est une réinvention plutôt amateur de la roue. Les ingénieurs logiciels professionnels utiliseront des API éprouvées et fiables, telles que TimerTask. ScheduledExecutorService est encore mieux, cependant; reportez-vous à Java Concurrency in Practice de Brian Goetz et al . Cette dernière classe existe depuis près d'une décennie - il est triste que toutes ces autres réponses l'ignorent.
Michael Scheper

2
@MichaelScheper, Merci, je suis heureux de voir que cette réponse a finalement dépassé la TimerTaskvariante. Fait intéressant, j'ai remarqué que la réponse acceptée n'est en fait pas correcte: \ L'âge des deux API mis à part, ScheduledExecutorServiceest simplement plus intuitivement déclaratif. L'utilisation de TimeUnitcomme paramètre rend bien plus clair ce qui se passe. Fini le temps du code 5*60*1000 // 5 minutes.
Tim Bender

2
@TimBender J'ai remarqué que vous aviez un 3 pour l'argument période. Je ne peux pas trouver si c'est en secondes ou en millisecondes. Je voudrais qu'il s'exécute toutes les 500 millisecondes (une demi-seconde).
JohnMerlino

2
Ahh je vois. Le quatrième argument vous permet de spécifier l'heure, par exemple TimeUnit.MILLISECONDS.
JohnMerlino

1
@TerryCarter En Java8 + Vous pouvez à la place faire Runnable helloRunnable = () -> { /*code */ };ce qui est encore plus beau;)
Joel

39

Essayez de faire ceci:

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

Ce code exécutera l'impression sur la console Hello World toutes les 5000 millisecondes ( 5 secondes). Pour plus d'informations, lisez https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html


16

Je le comprends avec une minuterie, j'espère que cela aide. J'ai utilisé une minuterie du java.util.Timeret TimerTaskdu même paquet. Voir ci-dessous:

TimerTask task = new TimerTask() {

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

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

10

Vous pouvez utiliser Thread.sleep(3000)inside for loop.

Remarque: cela nécessitera un try/catchblocage.


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

une boucle infinie est créée. La tâche du planificateur d'annonces est configurée.


4

Le moyen le plus simple serait de mettre le thread principal en veille de 3000 millisecondes (3 secondes):

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

Cela arrêtera le thread au moins X millisecondes. Le thread pourrait dormir plus longtemps, mais cela dépend de la JVM. La seule chose garantie est que le thread dormira au moins ces millisecondes. Jetez un œil à la Thread#sleepdoc:

Provoque la mise en veille du thread en cours d'exécution (arrêt temporaire de l'exécution) pendant le nombre de millisecondes spécifié, sous réserve de la précision et de l'exactitude des minuteries et des planificateurs système .


Merci @Luiggi. Java s'assurera toujours que c'est 3000 ms, quelle que soit la machine (CPU) sur laquelle je l'exécute, n'est-ce pas?
meiryo

@NandkumarTekale veut-il en dire plus?
meiryo

4
@meiryo Cela arrêtera le thread au moins X millisecondes. Le thread pourrait dormir plus longtemps, mais cela dépend de la JVM. La seule chose garantie est que le thread dormira au moins ces millisecondes.
Luiggi Mendoza

4
Attention: s'il ne s'agit pas d'un système en temps réel, le sommeil sera d'au moins 3000 ms, mais pourrait être plus long. Si vous voulez exactement 3000 ms de sommeil en particulier là où la vie humaine est en danger (instruments médicaux, avions de contrôle, etc.), vous devez utiliser un système d'exploitation en temps réel.
Kinjal Dixit

1
@meiryo: Luiggi et kinjal ont très bien expliqué :)
Nandkumar Tekale

3

L'utilisation java.util.Timeret la Timer#schedule(TimerTask,delay,period)méthode vous aideront.

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

Voici le moyen simple d'utiliser le thread 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!");
}

1

Ce qu'il a dit. Vous pouvez gérer les exceptions comme vous le souhaitez, mais Thread.sleep (millisecondes); est la meilleure route à emprunter.

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

1

Voici un autre moyen simple d'utiliser l'interface Runnable dans 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

Pour les petites applications, il est bien d'utiliser Timer et TimerTask comme Rohit l'a mentionné, mais dans les applications Web, j'utiliserais Quartz Scheduler pour planifier des tâches et effectuer de telles tâches périodiques.

Voir les tutoriels pour la planification Quartz.


-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();
    }
  }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.