Utilisez @ async dans Spring boot pour effectuer des appels asynchrones et accélérer l'exécution des tâches!

Canal de programme DD 2021-09-15 04:05:37
utilisez async dans spring boot


Qu'est - ce que“Appel asynchrone”?“Appel asynchrone”Ce qui correspond“Appel synchrone”,Un appel synchrone signifie que le programme est exécuté dans l'ordre défini,Chaque ligne de programme doit attendre la fin de l'exécution de la ligne précédente avant de pouvoir exécuter;Un appel asynchrone fait référence à un programme qui, lorsqu'il est exécuté séquentiellement,Exécuter le programme suivant sans attendre le résultat de l'instruction pour l'appel asynchrone.

Appel synchrone

Voici un exemple simple pour comprendre intuitivement ce qu'est un appel synchrone:

DéfinitionTaskCatégorie,Créer trois fonctions de traitement pour simuler chacune des trois opérations qui exécutent la tâche,Le temps de fonctionnement est pris au hasard(10En quelques secondes)

@Slf4j
@Component
public class AsyncTasks {
public static Random random = new Random();
public void doTaskOne() throws Exception {
log.info("Commencez la tâche 1");
long start = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
long end = System.currentTimeMillis();
log.info("Tâche 1 accomplie,Ça prend du temps:" + (end - start) + "MS");
}
public void doTaskTwo() throws Exception {
log.info("Début de la tâche 2");
long start = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
long end = System.currentTimeMillis();
log.info("Achèvement de la tâche 2,Ça prend du temps:" + (end - start) + "MS");
}
public void doTaskThree() throws Exception {
log.info("Commencez la tâche 3.");
long start = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
long end = System.currentTimeMillis();
log.info("Achèvement de la tâche 3,Ça prend du temps:" + (end - start) + "MS");
}
}

Dans un cas d'essai unitaire,InjectionTaskObjet,Et exécuter dans le cas d'essaidoTaskOnedoTaskTwodoTaskThreeTrois fonctions.

@Slf4j
@SpringBootTest
public class Chapter75ApplicationTests {
@Autowired
private AsyncTasks asyncTasks;
@Test
public void test() throws Exception {
asyncTasks.doTaskOne();
asyncTasks.doTaskTwo();
asyncTasks.doTaskThree();
}
}

Effectuer des essais unitaires,Vous pouvez voir une sortie similaire à celle - ci:

2021-09-11 23:19:12.922 INFO 92539 --- [ main] com.didispace.chapter75.AsyncTasks : Commencez la tâche 1
2021-09-11 23:19:17.788 INFO 92539 --- [ main] com.didispace.chapter75.AsyncTasks : Tâche 1 accomplie,Ça prend du temps:4865MS
2021-09-11 23:19:17.788 INFO 92539 --- [ main] com.didispace.chapter75.AsyncTasks : Début de la tâche 2
2021-09-11 23:19:24.851 INFO 92539 --- [ main] com.didispace.chapter75.AsyncTasks : Achèvement de la tâche 2,Ça prend du temps:7063MS
2021-09-11 23:19:24.851 INFO 92539 --- [ main] com.didispace.chapter75.AsyncTasks : Commencez la tâche 3.
2021-09-11 23:19:26.928 INFO 92539 --- [ main] com.didispace.chapter75.AsyncTasks : Achèvement de la tâche 3,Ça prend du temps:2076MS

Tâche 1、Tâche 2、La tâche 3 est terminée.,En d'autres termes,doTaskOne、doTaskTwo、doTaskThreeExécution de l'ordre des trois fonctions terminée.

Appel asynchrone

L'appel synchrone ci - dessus, bien qu'il ait réussi trois tâches,Mais vous pouvez voir que le temps d'exécution est plus long,S'il n'y a pas de dépendance entre les trois tâches elles - mêmes,Si elle peut être exécutée simultanément,Les appels synchrones sont moins efficaces en termes d'exécution,Il est possible d'envisager l'exécution simultanée par des appels asynchrones.

InSpring BootMoyenne,Nous avons juste besoin d'utiliser@AsyncLes annotations peuvent simplement transformer la fonction synchrone originale en fonction asynchrone,TaskModifier la classe comme suit::

@Slf4j
@Component
public class AsyncTasks {
public static Random random = new Random();
@Async
public void doTaskOne() throws Exception {
log.info("Commencez la tâche 1");
long start = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
long end = System.currentTimeMillis();
log.info("Tâche 1 accomplie,Ça prend du temps:" + (end - start) + "MS");
}
@Async
public void doTaskTwo() throws Exception {
log.info("Début de la tâche 2");
long start = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
long end = System.currentTimeMillis();
log.info("Achèvement de la tâche 2,Ça prend du temps:" + (end - start) + "MS");
}
@Async
public void doTaskThree() throws Exception {
log.info("Commencez la tâche 3.");
long start = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
long end = System.currentTimeMillis();
log.info("Achèvement de la tâche 3,Ça prend du temps:" + (end - start) + "MS");
}
}

Pour [email protected]'annotation prend effet,Il faut aussiSpring BootConfiguration dans le programme principal [email protected],Comme suit:

@EnableAsync
@SpringBootApplication
public class Chapter75Application {
public static void main(String[] args) {
SpringApplication.run(Chapter75Application.class, args);
}
}

Les tests unitaires peuvent maintenant être répétés,Vous pouvez rencontrer une variété de résultats différents,Par exemple,:

  • Aucune sortie liée à la tâche

  • Il y a une partie des extrants liés à la tâche

  • Sortie désordonnée liée à la tâche

  • La raison en est quedoTaskOnedoTaskTwodoTaskThreeTrois fonctions sont déjà asynchrones.Programme principal après appel asynchrone,Le programme principal ne tient pas compte de la question de savoir si l'exécution des trois fonctions est terminée,Comme il n'y a rien d'autre à faire,Donc le programme se termine automatiquement,Une condition qui a causé un contenu incomplet ou non lié à la tâche de sortie.

Note::@AsyncLa fonction modifiée n'est pas définie commestaticType,Pour que les appels asynchrones ne prennent pas effet

Rappel asynchrone

Pour quedoTaskOnedoTaskTwodoTaskThreeÇa se termine normalement.,Supposons que nous ayons besoin de compter combien de temps il faut pour exécuter les trois tâches simultanément,Pour ce faire, il faut attendre que les trois fonctions ci - dessus aient terminé le transfert pour enregistrer le temps,Et calculer les résultats.

Comment juger si les trois appels asynchrones ci - dessus ont été effectués?Nous devons utiliserCompletableFuture<T>Pour retourner les résultats d'un appel asynchrone,Comme ceci:doTaskOneFonctions:

 @Async
public CompletableFuture<String> doTaskOne() throws Exception {
log.info("Commencez la tâche 1");
long start = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
long end = System.currentTimeMillis();
log.info("Tâche 1 accomplie,Ça prend du temps:" + (end - start) + "MS");
return CompletableFuture.completedFuture("Tâche 1 terminée");
}

Après avoir modifié les deux autres fonctions asynchrones comme ci - dessus,Ensuite, nous allons modifier le cas d'essai,Laissez le test faire autre chose après avoir attendu que les trois appels asynchrones soient terminés.

@Test
public void test() throws Exception {
long start = System.currentTimeMillis();
CompletableFuture<String> task1 = asyncTasks.doTaskOne();
CompletableFuture<String> task2 = asyncTasks.doTaskTwo();
CompletableFuture<String> task3 = asyncTasks.doTaskThree();
CompletableFuture.allOf(task1, task2, task3).join();
long end = System.currentTimeMillis();
log.info("Tâche accomplie.,Temps total:" + (end - start) + "MS");
}

Voyons ce qu'on a fait.:

  • Enregistrer l'heure de début au début du cas d'essai
  • En appelant trois fonctions asynchrones,RetourCompletableFuture<String>Objet de résultat de type
  • AdoptionCompletableFuture.allOf(task1, task2, task3).join()Réaliser l'effet de blocage avant la fin des trois tâches asynchrones
  • Une fois les trois tâches terminées,Selon l'heure de fin - Heure de début,Calculer le temps total nécessaire à l'exécution simultanée des trois tâches.

Effectuer les essais unitaires ci - dessus,Vous pouvez voir les résultats suivants:

2021-09-11 23:33:38.842 INFO 95891 --- [ task-3] com.didispace.chapter75.AsyncTasks : Commencez la tâche 3.
2021-09-11 23:33:38.842 INFO 95891 --- [ task-2] com.didispace.chapter75.AsyncTasks : Début de la tâche 2
2021-09-11 23:33:38.842 INFO 95891 --- [ task-1] com.didispace.chapter75.AsyncTasks : Commencez la tâche 1
2021-09-11 23:33:45.155 INFO 95891 --- [ task-2] com.didispace.chapter75.AsyncTasks : Achèvement de la tâche 2,Ça prend du temps:6312MS
2021-09-11 23:33:47.308 INFO 95891 --- [ task-3] com.didispace.chapter75.AsyncTasks : Achèvement de la tâche 3,Ça prend du temps:8465MS
2021-09-11 23:33:47.403 INFO 95891 --- [ task-1] com.didispace.chapter75.AsyncTasks : Tâche 1 accomplie,Ça prend du temps:8560MS
2021-09-11 23:33:47.404 INFO 95891 --- [ main] c.d.chapter75.Chapter75ApplicationTests : Tâche accomplie.,Temps total:8590MS

Je vois.,Par appel asynchrone,Tâche 1、2.、Iii) exécution simultanée,Réduit efficacement le temps d'exécution total du programme.Cette série de tutoriels《Spring Boot 2.xTutoriels de base》Cliquez directement sur!,Bienvenue à la collection et à la transmission!En cas de difficultés d'apprentissage?Peut se joindre à nous SpringGroupe d'échange technique,Participer aux échanges et aux discussions,Améliorer l'apprentissage et le progrès!

Exemple de code

Le projet complet de cet article peut être consulté dans l'entrepôt ci - dessous2.xSous la table des matièreschapter7-5Ingénierie:

Si vous pensez que cet article est bon,BienvenueStarSoutien,Votre attention est le moteur de ma persévérance!

Bienvenue à mon numéro public:Programmeur singeDD,Partager des connaissances et des réflexions qui ne sont pas visibles ailleurs

版权声明
本文为[Canal de programme DD]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210914181746908f.html

  1. spring教程极客学院,Java这些高端技术只有你还不知道,
  2. Spring事务扩展机制,2021大厂Java知识点总结 面试题解析!
  3. SpringSecurity如何实现加密和解码,Spring事务是如何传播的?
  4. Interviewer: do redis transactions satisfy atomicity?
  5. SpringSecurity如何實現加密和解碼,Spring事務是如何傳播的?
  6. Comment la sécurité printanière implémente - t - elle le chiffrement et le décodage, et comment les transactions printanières se propagent - elles?
  7. Spring transaction extension Mechanism, 2021 Big Plant Java Knowledge point Summary Interview Question Analysis!
  8. Spring Tutorial geek Academy, Java, ces technologies haut de gamme que vous ne connaissez pas encore,
  9. Sword finger offer plan 9 (dynamic programming medium version) -- Java
  10. 2020 Summary - don't worry about the present, don't worry about the future, Java Web interview questions
  11. Huawei cloud guassdb (for redis) released a new version, and the two core features were officially unveiled
  12. Utilisez @ async dans Spring boot pour effectuer des appels asynchrones et accélérer l'exécution des tâches!
  13. Méthodes de fonctionnement des tableaux couramment utilisées en javascript
  14. MySQL practice 45 lectures (21-25) - Notes
  15. Java programmers must master 10 open source tools!
  16. Enterprise Understanding Spring CIO
  17. tomcat常见面试题,聊聊你对分布式锁技术方案的理解,
  18. spring源码视频教程,我是如何收割多家大厂offer的?
  19. spring框架教程推荐,2021最新爱奇艺Java社招面试题目,
  20. tomcat常見面試題,聊聊你對分布式鎖技術方案的理解,
  21. Spring事務擴展機制,2021大廠Java知識點總結 面試題解析!
  22. Des questions d'entrevue communes à Tomcat pour discuter de votre compréhension de la technologie de verrouillage distribué,
  23. Java Development Interview Question with Answers, 2021 Big Factory Java Knowledge point Summary Interview Question Analysis!
  24. Android 400 questions d'entrevue pour vous aider à entrer dans l'usine, un tour pour vous apprendre à comprendre netty
  25. Les développeurs Java, les entretiens techniques avec le magnat d'Ali,
  26. Java + SSM Maotai Liquor e - commerce Platform for Computer Graduation DesignVente d'alcool
  27. spring框架教程推薦,2021最新愛奇藝Java社招面試題目,
  28. Recommandé pour le tutoriel Spring Framework, 2021 dernière question d'entrevue d'embauche de la société aiqiyi Java,
  29. Spring source Video tutoriel, comment récolter plusieurs grandes usines?
  30. Springcloud learning notes (I)
  31. Basic knowledge of hive (III) complete collection of functions in hive
  32. spring源碼視頻教程,我是如何收割多家大廠offer的?
  33. 【微信小程序】,看看最新BTA大厂的Java程序员的招聘技术标准,
  34. 【工作经验分享】,2021最新百度、头条等公司Java面试题目,
  35. 【微信小程序】,看看最新BTA大廠的Java程序員的招聘技術標准,
  36. [Widget Wechat] pour voir les dernières normes techniques de recrutement des programmeurs Java de BTA.
  37. Video | Tencent cloud enterprise MySQL (CDB) - dynamic thread pool function
  38. Upgrade your Linux PC hardware using open source tools
  39. RTFM! How to read (and understand) the magic man pages in Linux
  40. [partage d'expérience de travail], 2021 les dernières questions d'entrevue Java de Baidu, Headlines, etc.
  41. Java 16 is coming online. You can't even use the features of Java 8, can you?
  42. Java (3) basic data types and their type conversion
  43. 一位Java大牛的BAT面试心得与经验总结,2021年Java春招面试经历,
  44. 一举拿下腾讯美团滴滴offer,快来瞧瞧这份Spring面试小抄!
  45. 一个Java应届生从上海离职,万字长文总结Java多进程,
  46. Seven design principles of java object-oriented design pattern
  47. 一個Java應届生從上海離職,萬字長文總結Java多進程,
  48. Un nouvel étudiant Java a quitté Shanghai et a résumé plusieurs processus Java.
  49. Prenez d'un coup l'offre de Tencent meituan et jetez un coup d'oeil à cette copie de l'entrevue de printemps!
  50. L'expérience et l'expérience d'un Maverick Java en matière d'entrevue sur les MTD, l'expérience de l'entrevue d'embauche du printemps Java en 2021,
  51. Interface graphique X: mise à jour des tables de rendu et optimisation du Code (compilation intégrée 10)
  52. Widget de vérification de fichiers personnalisés Linux
  53. Java thread pool - work queue
  54. [Part 7] - Summary of B2B2C e-commerce technology of spring cloud live mall managed by git branch
  55. Reflection type of Java Foundation
  56. Want to get started with data structures, but always fall under the pomegranate skirt of the linked list?
  57. Interviewer: do redis transactions satisfy atomicity?
  58. 一篇文章教你搞定计算机网络面试,350道Java面试真题分享,
  59. 一条正确的Java职业生涯规划,揭秘今年Java春招面试必问问题有哪些?
  60. 一名毕业三年的女程序媛面试头条经验,关于Redis主从节点数据过期一致性的思考,