Vorwort
In der vorherigen Spring Boot Basic Tutorial -Serie wurde der Artikel "@aSync zum Implementieren von asynchronen Aufrufen im Spring Boot" eingeführt, wie man @Async Annotation verwendet, um asynchrone Anrufe zu implementieren. Die Kontrolle über diese asynchronen Hinrichtungen ist jedoch unsere grundlegende Fähigkeit, die Gesundheit unserer eigenen Anwendungen sicherzustellen. Lassen Sie uns in diesem Artikel erfahren, ob wir die Parallelität asynchroner Anrufe durch benutzerdefinierte Thread -Pools steuern.
Wir können die Beispiele in diesem Artikel basierend auf den vorherigen Beispielen ändern oder ein brandneues Spring -Boot -Projekt erstellen, um es zu versuchen.
Fadenpool definieren
Der erste Schritt besteht darin, einen Thread -Pool in der Spring -Boot -Hauptklasse zu definieren, wie z. B.:
@SpringbootApplicationPublic Class Application {public static void main (String [] args) {SpringApplication.run (application.class, args); } @EnableAsync @Configuration class TaskpoolConfig {@bean ("taskexecutor") public Executor taskexecutor () {threadpooltaskexecutor executor = new threadpooltaskexecutor (); Executor.SetCorepoolSize (10); Executor.SetMaxpoolSize (20); Executor.SetqueUecapacity (200); Executor.SetkeepaliveSeconds (60); Executor.setThreadnamePrefix ("Taskexecutor-"); Executor.SetRejecteDexecutionHandler (neuer ThreadPoolexecutor.Callerrunspolicy ()); Rückgabereiter; }}}Oben haben wir einen Thread -Pool mithilfe von Threadpooltaskexecutor erstellt und die folgenden Parameter festgelegt:
Verwenden von Threadpool
Wie können wir nach der Definition des Thread -Pools die asynchronen genannten Ausführungsaufgaben mit den Ressourcen in diesem Thread -Pool ausgeführt? Die Methode ist sehr einfach. Wir müssen nur den Namen des Thread -Pools in der @Async -Annotation angeben, z. B.:
@Slf4j@componentPublic Class Task {public static random random = new random (); @ASync ("taskexecutor") public void dotaskone () löst Ausnahme aus {log.info ("Task eins"); Long start = system.currentTimemillis (); Thread.sleep (random.nextint (10000)); Long End = System.currentTimemillis (); log.info ("vollständige Aufgabe eins, Zeit genommen:" + (Ende - Start) + "Millisekunden"); } @Async ("taskexecutor") public void dotasktwo () löst Ausnahme aus {log.info ("Start Aufgabe 2"); Long start = system.currentTimemillis (); Thread.sleep (random.nextint (10000)); Long End = System.currentTimemillis (); log.info ("vollständige Aufgabe 2, Zeit genommen:" + (Ende - Start) + "Millisekunden"); } @Async ("taskexecutor") public void dotaskthree () löst Ausnahme aus {log.info ("Aufgabe drei"); Long start = system.currentTimemillis (); Thread.sleep (random.nextint (10000)); Long End = System.currentTimemillis (); log.info ("Aufgabe drei, zeitaufwändig:" + (Ende - Start) + "Millisekunden"); }}Unit -Tests
Lassen Sie uns schließlich einen Unit -Test schreiben, um ihn zu überprüfen
@Runwith (SpringJunit4ClASSRunner.class) @springBoottestPublic Class applicationTests {@autowired Private Task Task; @Test public void test () löst Ausnahme aus {task.dotaskone (); task.dotasktwo (); task.dotaskthree (); Thread.currentThread (). Join (); }}Führen Sie den oben genannten Unit -Test durch, wir können in der Konsole sehen, dass alle Ausgangs -Thread -Namen vom von uns definierten Thread -Pool vorangestellt werden, was bedeutet, dass unser Experiment mit dem Thread -Pool asynchrone Aufgaben ausführt.
2018-03-27 22: 01: 15.620 Info 73703 --- [Taskexecutor-1] com.didispace.async.task: Start Aufgabe eins
2018-03-27 22: 01: 15.620 Info 73703 --- [Taskexecutor-2] com.didispace.async.task: Start Aufgabe 2
2018-03-27 22: 01: 15.620 Info 73703 --- [Taskexecutor-3] com.Didispace.Async.task: Start Aufgabe drei
2018-03-27 22: 01: 18.165 Info 73703 --- [Taskexecutor-2] com.didispace
2018-03-27 22: 01: 22.149 Info 73703 --- [Taskexecutor-3] com.didispace.async.task: Komplette Aufgabe drei, Zeit genommen: 6529 Millisekunden
2018-03-27 22: 01: 23.912 Info 73703 --- [Taskexecutor-1] com.didispace
Vollständiges Beispiel:
Leser können das Projekt Kapitel 4-1-3 gemäß ihren Vorlieben anzeigen:
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.