Vorwort
Ich habe mehrere Artikel über die Implementierung asynchroner Anrufe mit @aSync geschrieben und auch Feedback von vielen Kinderschuhen erhalten. Unter ihnen geht es bei den meisten Problemen mit der Verwendung von Futures und der Zeitlimitkontrolle der asynchronen Ausführung. Ich werde also gemeinsam über das Umgang mit diesen beiden Problemen sprechen.
Wenn Sie die Verwendung von @Async -Anmerkungen nicht kennen, können Sie den vorherigen Artikel wie folgt überprüfen:
Definieren Sie asynchrone Aufgaben
Zunächst verwenden wir zuerst die @Async -Annotation, um eine asynchrone Aufgabe zu definieren. Diese Methode gibt den zukünftigen Typ wie folgt zurück:
@Slf4j@componentPublic Class Task {public static random random = new random (); @ASync ("taskexecutor") Public Future <string> run () löst Ausnahme aus {long sleep = random.nextint (10000); log.info ("Starten Sie die Aufgabe, Zeit zum Nehmen:" + schlaf + "msils"); Thread.sleep (schlaf); log.info ("die Aufgabe vervollständige"); Neue Asyncresult <> ("Test") zurückgeben; }}Tipps: Was ist der zukünftige Typ?
Die Zukunft ist eine Schnittstelle, die die Ausführungsergebnisse spezifischer Runnable- oder Callable -Aufgaben abbricht, prüft, ob die Abfrage abgeschlossen ist, und die Ergebnisse erhalten. Bei Bedarf können Sie das Ausführungsergebnis über die GET -Methode erhalten, die blockiert, bis die Aufgabe das Ergebnis zurückgibt.
Die Schnittstellendefinition lautet wie folgt:
öffentliche Schnittstelle zukünftige <V> {boolean abbrechen (boolean mayinterruptiFrunning); boolean iscancelled (); boolean isdone (); V Get () wirft InterruptedException, ExecutionException aus; V GET (langfristige Zeiteinheit) löst InterruptedException, ExecutionException, TimeoutException aus;}Es deklariert fünf Methoden wie diese:
Mit anderen Worten, Future bietet drei Funktionen:
Ausführung und Definition Timeout
Nach Abschluss der asynchronen Aufgabendefinition, die die Zukunft zurückgibt, versuchen wir, einen Unit -Test zu implementieren, um diese Zukunft zu verwenden, um die Ausführung der Aufgabe abzuschließen, z. B.:
@Slf4j@runwith (SpringJunit4ClASSRunner.class) @springBoottEtestpublic Class ApplicationTests {@autowired Private Task aufgaben; @Test public void test () löst Ausnahme aus {Future <string> futureresult = task.run (); String result = futureresult.get (5, TimeUnit.Seconds); log.info (Ergebnis); }}Im obigen Code definieren wir auch die Zeitüberschreitungszeit, damit der Thread in der GET -Methode ausgeführt werden kann. Durch die Ausführung dieses Tests können wir beobachten, dass wenn die Ausführungszeit 5 Sekunden überschreitet, hier eine Ausnahme von Zeitlagen geworfen wird. Der Ausführungs -Thread kann aufgrund des Ausführungszeitlimits wieder in den Thread -Pool freigegeben werden, um Ressourcen nicht zu blockieren und zu belegen.
Vollständiges Beispiel:
Leser können die folgenden zwei Repositorys auswählen, um Kapitel4-1-4 Projekte gemäß ihren Vorlieben anzuzeigen:
GitHub: https://github.com/dyc87112/springboot-learning/
Gitee: https://gitee.com/diidispace/springboot-learning/
Lokaler Download: http://xiazai.vevb.com/201805/yuanma/springboot-learning(vevb.com).rar
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.