Ich habe eine Reihe von asynchronen Operationen
%Vor%Dies hat einige Probleme:
Ich habe die folgenden Optionen untersucht, um dies zu mildern:
ExecuterService#invokeAll
- Ich sehe nicht, wie diese Lösung ohne Blockierung verwendet werden kann. ListenableFutures
und seine transform
-Methode. Ich sah, dass dies an wenigen Stellen um die Interweb-Nuss herum erwähnt wird. Ich sehe ehrlich nicht, wie dies mein Problem lösen würde. Die Frage ist also: Was wäre ein gutes Muster, um eine Reihe asynchroner Aufrufe in Java zu verketten? Auf der Suche nach einer Lösung, die mit Java 7 funktioniert, da ich dies für eine Android-App brauche.
Es ist sicherlich etwas rätselhaft in Bezug auf die tatsächliche Absicht und den Anwendungsfall, in dem Sie auf dieses Problem gestoßen sind. Außerdem ist nicht ganz klar, was something
, somethingElse
und yetAnotherThing
sind (woher sie kommen und wohin sie gehen sollen).
Basierend auf den von Ihnen zur Verfügung gestellten Informationen und als Ergänzung (oder eher Erweiterung oder Verallgemeinerung) der Antwort von slatertidan : Der Unterschied zwischen diesen Dummy-Aufrufen, die Sie dort skizziert haben, scheint
zu seinString
-Argument, das an die get
-Methode Callback
, die Sie könnten diese Teile ausfiltern: Das Argument String
und Callback
könnten als Parameter an eine allgemeine Methode übergeben werden, die ein Callable
erzeugt. Die Reihenfolge der Aufrufe könnte einfach definiert werden, indem diese Callable
-Objekte in der richtigen Reihenfolge in einer Liste platziert und alle mit einem single-threaded Executor-Service ausgeführt werden.
Wie Sie in der Methode main
dieses Beispiels sehen können, kann die Reihenfolge der Aufrufe dann relativ einfach konfiguriert werden:
(Im Beispiel wird invokeAll
verwendet, das blockiert, bis alle Aufgaben ausgeführt wurden. Dies könnte anders gelöst werden, um an der Aufrufseite wirklich nicht blockierend zu sein. Die Hauptidee besteht darin, eine Liste der Aufgaben zu erstellen alle mit der gleichen Methode erstellt Aufruf)
Ich unterstütze die genehmigte Antwort vollständig, aber ich werfe auch etwas ein, das ich für diese Art von Problemen erstellt habe, was praktisch ist, wenn Sie damit beginnen, bedingte Logik innerhalb Ihrer Kette von asynchronen Aktionen hinzuzufügen. Ich habe es kürzlich in eine einfache Bibliothek ( jasync-driver ) übersetzt.
So würden Sie Ihr Beispiel verkabeln. Wie Sie sehen können, hat jede Aufgabe keine Kenntnis von der folgenden Aufgabe. Im Gegensatz zu der genehmigten Antwort wird die Verkettung der Aufgaben durch einen einfachen synchronen (... schauenden) Methodenkörper anstelle einer Liste durchgeführt.
%Vor%Hier ist eine Optimierung des Beispiels, die eine bedingte Logik enthält, die von einem asynchronen Ergebnis abhängt:
%Vor%Wie Sie sehen, ist die asynchrone bedingte Logik so einfach wie das Schreiben einer if-Standardanweisung.
Tags und Links java asynchronous