endlich im Daemon-Thread blockieren

8

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.

    
Fedor Skrynnikov 18.07.2011, 12:33
quelle

3 Antworten

11

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.

    
Joachim Sauer 18.07.2011, 12:42
quelle
2

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%     

lab bhattacharjee 14.07.2012 15:36
quelle

Tags und Links