Wie wird CompleableFuture abgeleitet?

8

Ich möchte CompleableFuture von der Unterklasse entfernen, um sie zu überschreiben Der Standardwert Executor . Das heißt, wenn ein Benutzer eine Methode aufruft, ohne ein Executor anzugeben, möchte ich mein eigenes Executor anstelle des normalerweise von CompletableFuture verwendeten verwenden.

Der Javadoc weist auf die Möglichkeit der Unterklassenbildung hin:

  

Alle CompletionStage-Methoden werden unabhängig von anderen öffentlichen Methoden implementiert, sodass das Verhalten einer Methode nicht durch Überschreibungen anderer in Unterklassen beeinflusst wird.

Wie soll ich statische Methoden wie CompletableFuture.supplyAsync() in der Unterklasse implementieren, wenn die zugrunde liegende Implementierung von Methoden wie internalComplete() abhängt, die package-privat sind?

Wie soll man CompleableFuture ableiten?

Was ich versuche zu tun ...

Mein Benutzercode muss mehrere Tasks asynchron mit demselben Executor ausführen. Zum Beispiel: CompletableFuture.supplyAsync(..., executor).thenApplyAsync(..., executor).thenApplyAsync(..., executor) . Ich möchte, dass die benutzerdefinierte CompletableFuture -Implementierung den ersten Executor für alle nachfolgenden Aufrufe verwendet.

    
Gili 26.10.2014, 23:24
quelle

5 Antworten

5

Da Sie uns nicht gezeigt haben, was Sie versucht haben, haben wir keine Chance herauszufinden, was Sie genau gemacht haben und warum es fehlgeschlagen ist. Nach den Erläuterungen sieht es aus wie ein einfacher Dekorationsmuster-Job, der keines der inneren Arbeiten von CompletableFuture berühren muss.

%Vor%

Hier ist ein einfacher Testfall, der zeigt, dass es wie erwartet funktioniert:

%Vor%     
Holger 28.10.2014, 11:40
quelle
1

Beantworten Sie die ursprüngliche Frage - Wie soll man CompleableFuture ableiten?

Wahrscheinlich ist es eine bessere Option, wenn Sie von einer Reinraum-CompletionStage-Schnittstellenimplementierung (statt von der konkreten CompletableFuture-Klasse) ausgehen. Bitte werfen Sie einen Blick hier:

Ссылка

    
Valery Silaev 19.05.2016 13:24
quelle
0

Soweit ich sehen kann, benötigen Sie Ihre eigene Implementierung von internalComplete() , die Ihren eigenen Gegenwert von AltResult instanziiert, wenn null oder eine Ausnahme vorliegt. Und Ihre Unterklasse supplyAsync() soll eine neue Instanz Ihrer neuen Unterklasse CompletableFuture zurückgeben.

    
Amir Moghimi 27.10.2014 04:35
quelle
0

Ihr Ziel ist es, die Zugriffsgeschwindigkeit auf den Web-Service zu begrenzen. Ihre Lösung besteht darin, einen speziellen Executor zu verwenden, der Verzögerungen einführt. Dies ist nicht die beste Lösung, da einige Funktionen in der Kette einige Zeit für andere Aktivitäten benötigen, oder einfach zu lange in der Warteschlange warten, um auf O / S-Ebene zu prozessieren und somit nicht vor dem Zugriff auf den Web-Service verzögert werden müssen durch den Executor sowieso verzögert werden. Verzögerungen sollten in das Modul eingebettet sein, das tatsächlich Anforderungen an den Web-Service ausführt. Es sollte sich an die Zeit der vorherigen Anfrage erinnern und, wenn es zu klein ist, einfach Thread.sleep () aufrufen, bevor eine Anfrage über Socket gesendet wird. Auf diese Weise brauchen Sie keine CompletableFuture und können Funktionen direkt wie f3 aufrufen (f1 (f0))). Zumindest ist es lesbarer.

    
Alexei Kaigorodov 28.10.2014 19:47
quelle
-4

Async-Programmierung wird weitgehend missverstanden. Der theoretische Ansatz besteht darin, ein asynchrones Programm als Petri-Netz darzustellen, wobei Hauptkomponenten Token, Orte und Übergänge sind. Aus Programmierungssicht sollte der Übergang weiter in Auslösungsregel und Aktion aufgeteilt werden. Die logische Kette scheint zu lang zu sein, die Programmierer bevorzugen das vereinfachte Schema "Ereignis-Reaktion", das in komplexen Fällen nicht funktioniert. CompletableFuture ist noch mehr eingeschränkt, mit Schema "Aktion - primitive Transition - Aktion".

In Ihrem Fall muss jede Phase aus zwei Quellen gespeist werden: Ergebnis der vorherigen Phase und Ressourcen-Token, die den Zugriff auf den Web-Service ermöglichen. CompletableFuture passt einfach nicht für solche Fälle. Ich würde empfehlen, zuerst das Petri-Netz für Ihren Fall zu zeichnen und dann die grundlegende Infrastruktur von Grund auf neu zu implementieren, indem Sie Klassen mit synchronisierten Methoden verwenden. Oder probiere meine asynchrone Bibliothek df4j2 aus, die es erlaubt, Übergänge mit mehreren Orten zu erstellen.

    
Alexei Kaigorodov 28.10.2014 04:54
quelle

Tags und Links