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?
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.
Ich würde empfehlen, eine ScheduledExecutorService
zu verwenden. Um Ihr UpdaterThread()
alle 3 Sekunden auszuführen, können Sie Folgendes tun:
Sie können hier mehr lesen: Java Tutorials - Executor Interfaces .
> 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.
Tags und Links java multithreading