In einer einzelnen Thread -Anwendung wird das Ergebnis nur dann zurückgegeben, wenn die Berechnung vorbei ist.
Öffentliche String -DownloadContents (URL URL) löst IOException {Trystream input = url.openstream ()) {return ioutils.tring (Eingabe, Standardc harsets URL ("http://www.example.com");
DownloadContents () sieht harmlos aus, muss aber lange erledigt werden. Gleichzeitig müssen Sie, um die Verzögerung während des Wartenergebnisses zu verringern, möglicherweise andere Arbeiten gleichzeitig unabhängig übernehmen. In der Vergangenheit können Sie einen neuen Thread starten oder auf die Ergebnisse warten (Speicher aufnehmen, sperren, schlechtes Wait ()/Notify () Paar).
Im zukünftigen <T> -Modus wird klar:
Public static Future <String> Startdownloading (URL URL) {// ...} Finale Future <string> contentsfuture = Startdownload (neu, http: //www.example .com "); // Andere BerechnungFinal String contents = contentsfuture .erhalten ();
Wir werden erkennen, dass Startdownloading () nicht blockiert wird, aber es ist wichtig, dieses Prinzip zu verstehen. Im Gegenteil, wenn es schnell zurückgibt und ein leichtes zukünftiges <string> -Objekt zurückgibt. Dieses Objekt ist ein Versprechen, daher ist der zukünftige String -Typ verfügbar. Mit anderen Worten, Future ist ein Agent oder eine Objektverpackung, kein echtes Zielobjekt. Sobald die asynchrone Berechnung abgeschlossen ist, können Sie sie extrahieren. Welche Art von Schnittstelle bietet die Zukunft?
Future.get () ist die wichtigste Methode. Es blockiert und wartet, bis das Ergebnis des Versprechens verfügbar ist. Wenn wir diese Zeichenfolge also wirklich benötigen, rufen Sie die Get () -Methode an und warten Sie. Es gibt auch eine schwere Lastversion, die Timeout -Parameter akzeptiert.
In einigen Fällen möchten Sie möglicherweise heimlich prüfen, ob die Zukunft verfügbar ist. Dies kann durch isdone () erfolgen. Stellen Sie sich eine Situation vor, Ihr Benutzer wartet auf einige asynchrone Berechnungen.
Endgültige zukünftige <string> contentsfuture = startdownloading (neue URL ("http://www.example.com"); while (! Contentsfuture.isdone ()) {AskUSERTOWAIL (); tun somEcomputationInthemeantime (); ;;
Schließlich wird der Inhalt von Future. Wenn Sie diesem Modell folgen, werden Sie nicht damit beschäftigt sein zu warten und ISDone () abwechselnd jede Sekunde zu rufen.
Das Abbrechen von Futrues ist die letzte, die wir nicht abgedeckt haben. Stellen Sie sich vor, Sie beginnen die asynchrone Arbeit und können nur einige Zeit warten. Sie sind jedoch ein guter Bürger, Sie sollten dieses zukünftige Objekt sagen: Ich brauche Sie nicht mehr, es ist Ihnen egal. Dann können Sie Ressourcen sparen, indem Sie veraltete Aufgaben stoppen. Die Grammatik ist einfach:
Contentsfuture.cancel (wahr);
Wir alle verstecken uns gerne, Burenartparameter, oder? Die Stornierung kann auf zwei Arten implementiert werden: Bevor die Aufgabe beginnt, wird der falsche Parameter abgebrochen, vorausgesetzt, bevor die Ergebnisse der Zukunft der Zukunft ausgedrückt werden, beginnt die Berechnung. Sobald CALLABLE.CALL () auf die Hälfte läuft, möchten wir es beenden. Glaubst du, das ist gut? Phänomene diejenigen, die InterruptedException, die berüchtigt Sie werden zweifellos die Unterbrechungxzeption werfen und jemanden senden, um die Aufgabe des aktuellen Betriebs zu unterbrechen.
Wir verstehen jetzt, was Zukunft ist-ein Platzhalter, Sie können das Zielobjekt in Zukunft erhalten. Genau wie bei einem Auto gibt es keinen Schlüssel zur Herstellung. Aber wie können Sie eine Instanz der Zukunft in der Anwendung bekommen? Die beiden häufigsten Ressourcen sind Threadpools und asynchrone Methoden (Unterstützung des Threadpools). Daher kann die Startdownloading () -Methode umgeschrieben werden wie:
Private Final ExecutorService Pool = Executors.NewFixedThreadpool (10); InputStream input = url.openstream ()) {return ioutils.toString (Eingabe, StandardCharets.utf_8);}});}
Obwohl es viele mühsame Grammatikprobleme gibt, ist das grundlegende Denken einfach: Verpackung Computing, das für eine lange Zeit ausgeführt werden muss, ist für die verstellbare <string> und reichen () an den Thread -Pool. Themen. Nach der Übermittlung ist die Implementierung von Future <String> in irgendeiner Weise mit Ihrer Verknüpfung mit Ihrer Aufgabe und Ihrem Thread -Pool. Offensichtlich wird Ihre Aufgabe nicht sofort ausgeführt. Die Aufgabe, in der Mitte zu bleiben, kann auch die Aufgabe, die seit langem ausgeführt wird, abbrechen, aber dies ist eine kompliziertere Sache.
Sie können auch die Zukunft im Frühjahr und EJB treffen. Sie können beispielsweise die Annotation von @Async zum Spring -Framework hinzufügen:
@AsyncPublic Future <string> Startdownloading (endgültige URL -URL) löst IOException aus {try (inputStream input = url.openstream ()) {Neue Asyncres ult <> (ioutils.toString (input, standardcharsets.utf_8));
Beachten Sie, dass wir die Zukunft lediglich durch das Verpackungsergebnis in Asyncresult implementieren, diese Methode selbst wird jedoch nicht mit dem Thread -Pool oder dem verarbeiteten Asynchronen interagieren. Spring später wird alle Anrufe zum Startdownloading () und im Thread -Pool ausgeführt. In EJB wird dieselbe Funktion durch Hinzufügen von @AsynchronoNoNotation abgeschlossen.