Drucken Sie alle X Sekunden „Hallo Welt“

127

In letzter Zeit habe ich Schleifen mit großen Zahlen zum Ausdrucken verwendet 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++;
}

Ich verstehe, dass dies eine sehr dumme Methode ist, aber ich habe noch nie eine Timer-Bibliothek in Java verwendet. Wie würde man das Obige ändern, um alle 3 Sekunden zu drucken?

Meiryo
quelle
1
Während die folgenden Antworten Ihre Frage offensichtlich beantworten sollten, sollten Sie auch beachten, dass die Art und Weise, wie Sie dies tun, auf jedem Computer zu einem anderen Intervall führen würde. Hängt davon ab, wie schnell der Compiler ausgeführt werden kann.
IHazABone
Mögliches Duplikat des
Aufrufs

Antworten:

187

Sie können auch einen Blick auf nehmen Timerund TimerTaskKlassen , die Sie Ihre Aufgabe verwenden können , planen alle laufen nSekunden.

Sie benötigen eine Klasse, TimerTaskdie die public void run()Methode erweitert und überschreibt. Diese wird jedes Mal ausgeführt, wenn Sie eine Instanz dieser Klasse an die timer.schedule()Methode übergeben.

Hier ist ein Beispiel, das Hello Worldalle 5 Sekunden gedruckt wird: -

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
quelle
9
Beachten Sie, dass die 2-Parameter- scheduleMethode nach der angegebenen Verzögerung einmal ausgeführt wird. Der 3-Parameter scheduleoder scheduleAtFixedRatemüsste verwendet werden.
Tim Bender
2
lol ja. Manchmal bekomme ich Stimmen zu Antworten und stelle fest, dass sich mein eigenes Verständnis verbessert hat, seit ich das letzte Mal eine Lösung gefunden habe.
Tim Bender
4
@ TimBender Ich frage mich nur, ob OP seine Aufgabe wirklich erledigt hat;) Wie auch immer, jetzt würde ich es vorziehen, ExecutorServicefür diese Aufgaben zu verwenden. Das ist wirklich eine große Verbesserung gegenüber der herkömmlichen Thread-API. Ich habe es zum Zeitpunkt der Beantwortung einfach nicht benutzt.
Rohit Jain
4
Timer timer = new Timer(true);sollte trueals Deamon eingestellt werden. Es sei denn, Sie möchten, dass der Timer nach dem Schließen der Anwendung noch läuft.
Tomasz Mularczyk
Dies hat mir geholfen, endlich auch Timer zu verstehen. + 1.Halten Sie die gute Arbeit aufrecht!
Daniel Tork
197

Wenn Sie eine regelmäßige Aufgabe ausführen möchten, verwenden Sie a ScheduledExecutorService. Speziell ScheduledExecutorService.scheduleAtFixedRate

Der 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);
Tim Bender
quelle
10
Ich hoffe, jemand anderes stimmt dem ebenfalls zu. Thread.sleep () passt vielleicht am besten zum OP-Code, ist aber eine ziemlich amateurhafte Neuerfindung des Rades. Professionelle Softwareentwickler verwenden bewährte APIs wie TimerTask. ScheduledExecutorService ist jedoch noch besser. Siehe Brian Goetz et al., Java Concurrency in Practice . Die letztere Klasse gibt es seit fast einem Jahrzehnt - es ist traurig, dass all diese anderen Antworten sie übersehen.
Michael Scheper
2
@ MichaelScheper, Danke, ich bin froh zu sehen, dass diese Antwort die TimerTaskVariante endlich übertroffen hat . Interessanterweise habe ich festgestellt, dass die akzeptierte Antwort tatsächlich nicht korrekt ist: \ Das Alter der beiden APIs ScheduledExecutorServiceist einfach intuitiver deklarativ. Die Verwendung TimeUnitals Parameter macht viel deutlicher, was passiert. Vorbei sind die Tage des Codes wie 5*60*1000 // 5 minutes.
Tim Bender
2
@ TimBender Ich habe festgestellt, dass Sie eine 3 für den Punkt Argument haben. Ich kann nicht finden, ob das in Sekunden oder Millisekunden ist. Ich möchte, dass es alle 500 Millisekunden (eine halbe Sekunde) ausgeführt wird.
John Merlino
2
Ahh ich verstehe. Mit dem vierten Argument können Sie die Zeit angeben, z. B. TimeUnit.MILLISECONDS.
John Merlino
1
@ TerryCarter In Java8 + Sie können stattdessen tun, Runnable helloRunnable = () -> { /*code */ };was noch schöner ist;)
Joel
39

Versuchen Sie Folgendes:

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

Dieser Code wird alle 5000 Millisekunden ( 5 Sekunden) auf der Konsole Hello World gedruckt . Weitere Informationen finden Sie unter https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html


quelle
16

Ich finde es mit einem Timer heraus, hoffe es hilft. Ich habe einen Timer von java.util.Timerund TimerTaskaus demselben Paket verwendet. Siehe unten:

TimerTask task = new TimerTask() {

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

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

Sie können Thread.sleep(3000)inside for loop verwenden.

Hinweis: Dies erfordert einen try/catchBlock.

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

Endlosschleife erstellt Anzeigenplaner Task ist konfiguriert.

Vicky
quelle
4

Am einfachsten wäre es, den Haupt-Thread auf 3000 Millisekunden (3 Sekunden) einzustellen:

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

Dadurch wird der Thread mindestens X Millisekunden angehalten. Der Thread könnte länger schlafen, aber das liegt an der JVM. Das einzige, was garantiert ist, ist, dass der Thread mindestens diese Millisekunden schläft. Schauen Sie sich das Thread#sleepDokument an:

Bewirkt, dass der aktuell ausgeführte Thread für die angegebene Anzahl von Millisekunden in den Ruhezustand versetzt wird (die Ausführung wird vorübergehend eingestellt), abhängig von der Präzision und Genauigkeit der Systemzeitgeber und -planer .

Luiggi Mendoza
quelle
Danke @Luiggi. Java stellt immer sicher, dass es 3000 ms sind, egal auf welcher Maschine (CPU) ich es ausführe, oder?
Meiryo
@NandkumarTekale möchten Sie mehr ausarbeiten?
Meiryo
4
@meiryo Es stoppt den Thread mindestens X Millisekunden. Der Thread könnte länger schlafen, aber das liegt an der JVM. Das einzige, was garantiert ist, ist, dass der Thread mindestens diese Millisekunden schläft.
Luiggi Mendoza
4
Vorsichtsmaßnahme: Wenn dies kein Echtzeitsystem ist, beträgt der Schlaf mindestens 3000 ms, kann aber länger sein. Wenn Sie genau 3000 ms Schlaf wünschen, insbesondere wenn Menschenleben gefährdet sind (medizinische Instrumente, Flugzeuge steuern usw.), sollten Sie ein Echtzeitbetriebssystem verwenden.
Kinjal Dixit
1
@ Meiryo: Luiggi und Kinjal sehr gut erklärt :)
Nandkumar Tekale
3

Verwendung java.util.Timerund Timer#schedule(TimerTask,delay,period)Methode werden Ihnen helfen.

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
quelle
2

Dies ist die einfache Möglichkeit, Thread in Java zu verwenden:

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!");
}
user3928455
quelle
1

Was er sagte. Sie können die Ausnahmen behandeln, wie Sie möchten, aber Thread.sleep (Millisekunden); ist der beste Weg zu nehmen.

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

Hier ist eine weitere einfache Möglichkeit, die Runnable-Schnittstelle in Thread Constructor zu verwenden

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
quelle
0

Hinzufügen Thread.sleep

try {
        Thread.sleep(3000);
    } catch(InterruptedException ie) {}
Russell Gutierrez
quelle
-1

Für kleine Anwendungen ist es in Ordnung, Timer und TimerTask wie von Rohit erwähnt zu verwenden, aber in Webanwendungen würde ich Quartz Scheduler verwenden, um Jobs zu planen und solche periodischen Jobs auszuführen.

Siehe Tutorials zur Quarzplanung.

Nandkumar Tekale
quelle
-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();
    }
  }
}
user3017805
quelle