Maison  >  Article  >  Java  >  Implémentation et analyse de tâches asynchrones Java

Implémentation et analyse de tâches asynchrones Java

PHPz
PHPzavant
2023-04-22 20:49:061530parcourir

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.

Edit

Implémentation et analyse de tâches asynchrones JavaMais 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é !

Modifier

Implémentation et analyse de tâches asynchrones Java4. 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

Edit

Implémentation et analyse de tâches asynchrones JavaVous 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer