Ich möchte einen Befehlszeilen-Daemon schreiben, der für immer läuft. Ich verstehe, dass, wenn ich will, dass die JVM in Linux elegant herunterfahren kann, man den Bootstrap über einen C-Code einpacken muss. Ich denke, dass ich mit einem Shutdown-Haken in Ordnung sein werde.
Weiter zu meinen Fragen:
Also normalerweise würde ich tun:
%Vor%Nun dachte ich mir, wenn ich Superdaemon über einen Executor starte, kann ich
machen %Vor% Ist Future.get()
mit Thread.join () implementiert?
Wenn nicht, verhält es sich äquivalent?
Grüße,
ashitaka
Ja, die Art, wie Sie diese geschrieben haben, ist äquivalent.
Sie müssen jedoch nicht wirklich warten, bis der Superdaemon-Thread abgeschlossen ist. Wenn der Haupt-Thread main () beendet, wird dieser Thread beendet, die JVM jedoch nicht. Die JVM wird weiter ausgeführt, bis der letzte Nicht-Daemon-Thread seine Ausführungsmethode beendet.
Zum Beispiel
%Vor%Sie sehen die Ausgabe:
%Vor%Mit anderen Worten, der Haupt-Thread wird zuerst beendet, dann wird der sekundäre Thread beendet und die JVM wird beendet.
Das Problem ist, dass Bücher wie JCIP dafür eintreten, dass wir Executors verwenden, um Threads zu starten. Also versuche ich mein Bestes, Thread.start () nicht zu benutzen. Ich bin mir nicht sicher, ob ich unbedingt einen bestimmten Weg wählen würde, einfach nur auf der Basis von Einfachheit zu handeln. Es muss einen überzeugenderen Grund geben, nein?
Der überzeugende Grund, java.util.concurrent zu verwenden, ist, dass Multi-Thread-Programmierung sehr schwierig ist. Java bietet die Tools für diese (Threads, die synchronisierten und volatile Schlüsselwörter), aber das bedeutet nicht, dass Sie sie direkt verwenden können, ohne sich in den Fuß zu schießen: Entweder zu viel Synchronisation, was zu unnötigen Engpässen und Deadlocks oder zu wenig führt, was zu einem fehlerhaften Verhalten aufgrund von Rennbedingungen führt).
Mit java.util.concurrent erhalten Sie eine Reihe von (von Experten geschriebenen) Hilfsprogrammen für die gebräuchlichsten Nutzungsmuster, die Sie einfach benutzen können, ohne sich Sorgen zu machen, dass Sie die richtigen Dinge richtig verstanden haben .
In Ihrem speziellen Fall verstehe ich jedoch nicht, warum Sie überhaupt einen separaten Thread benötigen, Sie können auch den Hauptthread verwenden:
%Vor%Executors sind für Aufgaben gedacht, die Sie im Hintergrund ausführen möchten (wenn Sie mehrere parallele Tasks haben oder wenn Ihr aktueller Thread weiterhin etwas anderes tun kann).
Sort'a. Future.get()
dient dazu, einen Thread auszulösen und etwas zu berechnen und dann auf sichere Weise an den aufrufenden Thread zurückzugeben. Es würde funktionieren, wenn der get
nie zurückgegeben würde. Aber ich würde bei dem join
-Aufruf bleiben, da es einfacher und kein Executer-Overhead ist (nicht, dass es so viel geben würde).
Bearbeiten
Es sieht aus wie ExecutorService.submit(Runnable)
soll genau das tun, was Sie versuchen. Es gibt nur null
zurück, wenn der Runnable
abgeschlossen ist. Interessant.
Tags und Links java concurrency