Java Hintergrund Thread erstellen, der periodisch etwas tut

7

Ist es möglich, einen separaten Hintergrund-Thread zu erstellen, der etwas anderes tun würde? Ich habe das folgende Programm ausprobiert, aber es funktioniert nicht wie ich es erwarte.

%Vor%

Ich habe erwartet, dass alle 3 Sekunden "3 Sekunden vergangen sind" im Fluss von mehreren "-" Strings gedruckt werden. Tatsächlich wird "3 Sekunden vergangen" nie gedruckt. Warum? Und wie kann ich einen Hintergrund-Thread erstellen, der etwas unabhängig vom Haupt-Thread macht?

    
Sergey 17.07.2012, 10:41
quelle

5 Antworten

13

Verwenden Sie java.util.TimerTask und java.util.Timer :

%Vor%     
hmjd 17.07.2012, 10:44
quelle
6

Es wird gedruckt "3 Sekunden vergangen". Entferne die System.out.println("--") und du wirst sie leichter sehen; -)

Jetzt könntest du auch ScheduledExecutorService verwenden und Runnable anstelle von Thread verwenden:

%Vor%     
assylias 17.07.2012 10:47
quelle
3

Sie können den obigen Ansatz verwenden, um Stuff in regelmäßigen Abständen auszuführen, obwohl ein TimerTask möglicherweise einfacher ist.

In Bezug auf deine Ausgabe vermute ich, dass dein Haupt-Thread deine UpdaterThread nicht laufen lässt, da sie sich in einer sehr engen Schleife befindet. Beachten Sie, dass dies von verfügbaren CPUs / Kernen abhängen würde.

Haben Sie erwogen, in Ihrem main -Thread zu schlafen oder Thread.yield () zu verwenden? ? Beachten Sie die Bedingungen auf dieser verknüpften Seite:

  

Wann sollte yield () verwendet werden?

     

Ich würde praktisch nie sagen. Sein Verhalten ist nicht standardisiert   und es gibt im Allgemeinen bessere Möglichkeiten, die Aufgaben, die Sie ausführen, auszuführen   Vielleicht möchten Sie mit yield () arbeiten: Wenn Sie nur a   Teil der CPU, können Sie dies auf eine kontrollierbarere Weise tun   Schätzen, wie viel CPU der Thread in seinem letzten Teil verwendet hat   Verarbeitung, dann schlafen für eine gewisse Zeit zu kompensieren: zu sehen   die Methode sleep ();

Beachten Sie auch diesen interessanten Artikel zum Umgang mit Thread-Unterbrechungen.

    
Brian Agnew 17.07.2012 10:43
quelle
1

Ich würde empfehlen, eine ScheduledExecutorService zu verwenden. Um Ihr UpdaterThread() alle 3 Sekunden auszuführen, können Sie Folgendes tun:

%Vor%

Sie können hier mehr lesen: Java Tutorials - Executor Interfaces .

>     
Keppil 17.07.2012 10:47
quelle
1

Es gibt viele Antworten, aber niemand sagt, warum sein Beispiel nicht funktioniert hat. System.out ist der Ausgabestream, also nachdem Sie angefangen haben, in diesen Stream zu schreiben, sperrt JAVA ihn und alle anderen Threads warten, während die Sperre auf den Stream angewendet wird. Nachdem der Stream entsperrt wurde, kann ein anderer Thread mit diesem Stream arbeiten.

Damit das Beispiel funktioniert, sollten Sie Thread.sleep in while loop im Hauptthread hinzufügen.

    
Serjio 17.07.2012 18:53
quelle

Tags und Links