Qu'elle soit dans la vie ou dans un programme, elle peut être grossièrement divisée en deux types : synchrone et asynchrone.
Synchronisation : Par exemple, si vous allez manger du Haidilao, vous devez d'abord commander le fond de la marmite, puis les plats, puis le serveur apporte le fond de la marmite, puis les plats, et enfin vous pouvez manger les plats . Ce processus doit être effectué dans l'ordre.
Tâche asynchrone : Allons manger du Haidilao. Il y a beaucoup de monde en train de manger devant vous. Vous devrez peut-être faire la queue et attendre d'être en ligne avant de pouvoir entrer dans le restaurant. Mais que se passe-t-il si vous voulez aller aux toilettes à mi-chemin ? Vous devez à nouveau faire la queue à votre retour. Il y a donc un système d'appel. Vous faites d'abord la queue pour obtenir un numéro, puis vous pouvez aller vous faire masser, regarder un film, aller au spa, acheter une tasse de thé au lait... C'est enfin votre tour, et vous serez averti à ce moment-là que vous faites la queue, et vous pourrez alors entrer. Ce processus est asynchrone. 2. SpringBoot + Async
Plus tard, je me suis souvenu que SpringBoot dispose d'un framework asynchrone plus pratique, Async
Le code est également très simple. Il vous suffit d'ajouter @Async à la méthode qui nécessite une exécution asynchrone et d'ajouter @EnableAsync à la classe de démarrage SpringBoot
@Async public void task() { // do something }
. 3. Journal des pièges par étapes
Par souci de commodité, j'ai construit une démo locale et saisi directement le code
@RestController public class AsyncController { @Autowired private AsyncService asyncService; @GetMapping("/v1/say") public String sayV1() { asyncService.sayV1(); return "success1"; } @GetMapping("/v2/say") public String sayV2() { asyncService.sayV2(); return "success2"; } }
@Service public class AsyncService { public void sayV1() { try { Thread.sleep(3000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("hello world"); } @Async public void sayV2() { try { Thread.sleep(3000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("hello world"); } }
Une démo très simple qui fournit deux interfaces, /v1/say et /v2/say, une pour l'exécution synchrone et une pour l'exécution asynchrone, via sleep 3 Seconds pour simuler des tâches fastidieuses
Démarrez normalement sans aucun problème. S'il est exécuté de manière synchrone, attendez 3 secondes avant le retour du thread principal. S'il est exécuté de manière asynchrone, revenez immédiatement. Après 3 secondes, helloworld sera affiché. quand j'ajoute Après le point d'arrêt, le problème est survenu.
J'ai d'abord ajouté un point d'arrêt sur la ligne qui imprime hello world. L'effet est le même que celui d'origine, sauf qu'il est bloqué avant l'impression, mais cela n'affecte pas le retour du thread principal.
EditMais lorsque j'ai ajouté un point d'arrêt là où la méthode entre en jeu, j'ai découvert que le thread principal était en fait bloqué !
Modifier4. Résoudre
Divers dépannages, @Async ne prend pas effet, les tâches asynchrones attendent le retour du thread principal et aucune solution efficace n'a été trouvée.
Avec l'attitude de l'essayer, j'ai trouvé la configuration de débogage
EditVous pouvez choisir de bloquer le jvm ou de bloquer le thread actuel pour les points d'arrêt. La valeur par défaut est de bloquer le jvm.
Sélectionnez le fil de discussion comme suspendu et le fil de discussion principal ne sera plus bloqué
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!