Ist Future.get () ein Ersatz für Thread.join ()?

8

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:

  1. Mein main-Block (String []) wird einen separaten Superdaemon auslösen.
  2. Der Superdaemon wird für immer abfragen und loopen.

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

    
ashitaka 06.03.2009, 03:15
quelle

4 Antworten

12

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.

    
mtnygard 06.03.2009, 05:21
quelle
6
  

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).

    
Thilo 06.03.2009 04:01
quelle
1

Future.get () wird die zukünftige Antwort von einem asynchronen Aufruf erhalten. Dies wird auch blockieren, wenn der Anruf noch nicht abgeschlossen wurde. Es ist ähnlich wie ein Thread beitreten.

Ссылка

    
Suroot 06.03.2009 03:20
quelle
0

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.

    
sblundy 06.03.2009 03:19
quelle

Tags und Links