Ich weiß, dass schließlich Blöcke in Deamon-Threads nicht ausgeführt werden. Aber meine akribische Natur versucht zu verstehen, warum und was in JVM so besonders ist, dass es den Code unter diesem Block nicht nennen konnte.
Ich denke, dass es irgendwie mit Call Stacks zu tun hat, dass es sich nicht entspannen würde, aber ich weiß nicht wie. Kann jemand bitte etwas Licht in diese Sache bringen? Danke.
Wer sagt, dass finally
Blöcke in Daemon-Threads nicht ausgeführt werden? Dies ist im Allgemeinen nicht .
Was Sie können haben gehört, dass ein finally
-Block nicht garantiert ausgeführt wird, wenn eine JVM während der Ausführung des Blocks try
(oder catch
) heruntergefahren wird. Das ist korrekt (und es kann leicht mit Daemon-Threads passieren).
Aber noch einmal: Während des normalen Betriebs gibt es nothing , das verhindert, dass finally
Blöcke normal in Daemon-Threads ausgeführt werden: Sie werden nicht anders gehandhabt.
Das Herunterfahren-Problem ist einfach: Wenn die JVM aufgefordert wird herunterzufahren oder sogar zum Herunterfahren gezwungen wird, kann es einfach nicht mehr fähig sein, weitere Anweisungen auszuführen.
Auf POSIX-y-Betriebssystemen erzwingt beispielsweise das Signal 9 (SIGKILL) eine Anwendung, die beendet werden soll, sodass keine Bereinigung möglich ist (daher wird Signal 15 (SIGTERM) bevorzugt , gewöhnlich). In diesem Fall kann die JVM den finally
-Block nicht ausführen, weil das Betriebssystem es nicht mehr ausführen lässt.
Wenn die JVM beendet wird, während der Versuchs- oder Fangcode ausgeführt wird, kann der finally-Block dies tun nicht ausführen.
Normales Herunterfahren - dies geschieht entweder beim Letzter Nicht-Daemon-Thread wird beendet oder wenn Runtime.exit ()
Wenn ein Thread beendet wird, führt die JVM aus eine Bestandsaufnahme der laufenden Threads, und wenn die einzigen Threads, die übrig sind, Daemon-Threads sind, wird ein ordnungsgemäßes Herunterfahren initiiert. Wenn die JVM anhält, werden alle verbleibenden Daemon-Threads abgebrochen, schließlich werden Blöcke nicht ausgeführt, Stacks werden nicht abgewickelt, die JVM wird einfach beendet. Daemon-Threads sollten nur sparsam verwendet werden. Nur wenige Verarbeitungsaktivitäten können jederzeit ohne Bereinigung verlassen werden. Insbesondere ist es gefährlich, Daemon-Threads für Aufgaben zu verwenden, die eine beliebige Art von E / A ausführen können. Daemon-Threads werden am besten für "Housekeeping" -Tasks gespeichert, z. B. ein Hintergrundthread, der regelmäßig abgelaufene Einträge aus einem speicherinternen Cache entfernt.
Letzter Nicht-Daemon-Thread beendet Beispiel:
%Vor%Ausgabe:
%Vor%Ich habe zwei Nicht-Daemon-Threads erstellt, die vor den restlichen zwei Daemon-Threads enden.
Ein Nicht-Daemon-Thread wartet 20 Sek. ein Daemon-Thread warte 40 Sek. lang, ein Nicht-Daemon Thread 15 Sekunden lang schlafen, ein Daemon Thread Schlaf für 30 Sekunden, ein Daemon Thread Schlaf für 10 Sekunden. Die Idee, Nicht-Daemon-Threads vor einigen Daemon-Threads zu beenden.
Wie das Ergebnis andeutet, wird die JVM beendet, sobald kein Nicht-Daemon-Thread mehr aktiv ist, ohne die rest-Anweisungen in den Runnable-Tasks der Daemon-Threads auszuführen, selbst wenn sie innerhalb des Blocks ohne InterruptedException blockiert werden / p> %Vor%