Implémentation et analyse de tâches asynchrones Java
1. Qu'est-ce qu'une tâche asynchrone
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
Au début, j'ai pensé à ouvrir un pool de threads et à lancer les tâches dans le pool de threads pour les terminer.
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
Bien que le code soit petit, les pièges ne diminueront pas à mesure que la quantité de code diminue.
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é !
4. 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.
Plus tard, un collègue m'a rappelé, cela pourrait-il être le fil de discussion bloqué par la fonction de débogage ?
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

PHP et Python ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1.Php convient au développement Web, avec une syntaxe simple et une efficacité d'exécution élevée. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et des bibliothèques riches.
