Table des matières
Qu'est-ce que CyclicBarrier
Utilisation de base de CyclicBarrier
Implémentation du code source de CyclicBarrier
(1) Initialisation de CyclicBarrier
(2) Attente et réveil de CyclicBarrier
Scénarios d'utilisation de CyclicBarrier
Maison Java javaDidacticiel Comment utiliser la classe d'outil de synchronisation multithread Java CyclicBarrier

Comment utiliser la classe d'outil de synchronisation multithread Java CyclicBarrier

May 13, 2023 am 11:19 AM
java cyclicbarrier

    Qu'est-ce que CyclicBarrier

    CyclicBarrier est une classe d'outil de synchronisation fournie dans le package de concurrence Java. Elle permet à plusieurs threads d'attendre à une certaine barrière jusqu'à ce que tous les threads atteignent la barrière avant de poursuivre l'exécution. Le principe d'implémentation de CyclicBarrier est basé sur ReentrantLock et Condition, et l'attente et le réveil des threads sont réalisés en appelant plusieurs fois la méthode wait().

    Utilisation de base de CyclicBarrier

    L'utilisation de base de CyclicBarrier est très simple. Il vous suffit de créer un objet CyclicBarrier et de définir la valeur du compteur sur le nombre de threads en attente. Une fois l'exécution de chaque thread terminée, appelez la méthode wait() de CyclicBarrier pour attendre que les autres threads terminent leur exécution. Lorsque tous les threads atteignent la barrière, la barrière sera ouverte et tous les threads continueront à s'exécuter.

    Implémentation du code source de CyclicBarrier

    Le principe d'implémentation de CyclicBarrier est basé sur ReentrantLock et Condition, et l'attente et le réveil des threads sont obtenus en appelant plusieurs fois la méthode wait(). L'implémentation du code source de CyclicBarrier comprend principalement deux parties : l'initialisation de la barrière et l'attente et le réveil de la barrière.

    (1) Initialisation de CyclicBarrier

    Lors de la création d'un objet CyclicBarrier, vous devez spécifier le nombre de threads en attente et l'opération d'exécution de la barrière. La méthode de construction de l'objet CyclicBarrier est la suivante :

    public CyclicBarrier(int parties, Runnable barrierAction)
    Copier après la connexion

    où parties représente le nombre de threads en attente, et barrièreAction représente l'opération effectuée par la barrière.

    Dans la méthode de construction, un tableau ReentrantLock de la taille d'un groupe et un objet Condition seront créés en fonction du nombre de threads en attente. Le tableau ReentrantLock est utilisé pour garantir que plusieurs threads peuvent atteindre la barrière et attendre en même temps, et l'objet Condition est utilisé pour attendre et réveiller les threads.

    (2) Attente et réveil de CyclicBarrier

    Lorsque le thread exécute la méthode wait(), il tentera d'abord d'acquérir le verrou de l'objet ReentrantLock. Si l'acquisition échoue, le thread sera ajouté à la file d'attente. attendre que le verrou soit libéré. Après avoir acquis le verrou, le thread déterminera si le compteur actuel a atteint le nombre de threads en attente. Si tel est le cas, il effectuera des opérations de barrière et réinitialisera le compteur aux parties, réveillant ainsi tous les threads de la file d'attente. Si le compteur n'atteint pas le nombre de threads en attente, le thread sera ajouté à la file d'attente pour attendre l'arrivée des autres threads.

    Le code source de la méthode wait() de CyclicBarrier est le suivant :

    public int await() throws InterruptedException, BrokenBarrierException {
        try {
            // 获取锁
            lock.lock();
            // 计数器减1
            int index = --count;
            if (index == 0) {
                // 如果计数器为0,执行屏障操作并唤醒等待队列中的所有线程
                final Runnable command = barrierCommand;
                if (command != null) {
                    command.run();
                }
                next
            trip.signalAll();
        } else {
            try {
                // 等待其他线程到达屏障处
                int phase = generation;
                trip.await();
                // 如果是最后一个到达屏障的线程,执行屏障操作并唤醒等待队列中的所有线程
                if (phase == generation) {
                    command = barrierCommand;
                    if (command != null) {
                        command.run();
                    }
                }
                // 计数器重置
                nextGeneration();
            } catch (InterruptedException ie) {
                // 如果线程在等待时被中断,抛出InterruptedException异常
                cancel();
                throw ie;
            } catch (BrokenBarrierException bbe) {
                // 如果屏障被破坏,抛出BrokenBarrierException异常
                broken = true;
                trip = new Condition[parties];
                throw bbe;
            }
        }
        return index;
    } finally {
        // 释放锁
        lock.unlock();
    }
    }
    Copier après la connexion

    Dans la méthode wait() de CyclicBarrier, acquérez d'abord le verrou de l'objet ReentrantLock et décrémentez le compteur de 1. Si le compteur est à 0, effectuez l'opération de barrière et réveillez tous les threads de la file d'attente. Si le compteur n'est pas à 0, attendez que d'autres threads arrivent à la barrière.

    Pendant le processus d'attente, si le thread est interrompu, une InterruptedException sera levée. Si la barrière est brisée, une BrokenBarrierException sera levée. Si c'est le dernier thread à atteindre la barrière, l'opération de barrière sera effectuée et tous les threads de la file d'attente seront réveillés et le compteur sera réinitialisé aux parties.

    Scénarios d'utilisation de CyclicBarrier

    CyclicBarrier convient aux scénarios dans lesquels plusieurs threads doivent s'attendre les uns les autres pour atteindre un certain point de barrière avant de continuer à s'exécuter. Par exemple, si plusieurs threads doivent exécuter une certaine tâche en même temps, mais qu'une certaine tâche doit attendre que d'autres tâches soient terminées avant de continuer, vous pouvez utiliser CyclicBarrier pour réaliser la synchronisation et la collaboration des threads.

    De plus, CyclicBarrier peut également être utilisé pour mettre en œuvre le traitement du pipeline. Par exemple, dans le modèle producteur-consommateur, plusieurs producteurs peuvent ajouter des données à la file d'attente en même temps. Lorsque la file d'attente est pleine, tous les producteurs doivent attendre. au consommateur de traiter les données. Continuez ensuite à ajouter des données.

    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 de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Meilleurs paramètres graphiques
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Comment réparer l'audio si vous n'entendez personne
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    Où trouver la courte de la grue à atomide atomique
    1 Il y a quelques semaines By DDD

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

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

    Racine carrée en Java Racine carrée en Java Aug 30, 2024 pm 04:26 PM

    Guide de la racine carrée en Java. Nous discutons ici du fonctionnement de Square Root en Java avec un exemple et son implémentation de code respectivement.

    Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

    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.

    Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

    Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

    Numéro Armstrong en Java Numéro Armstrong en Java Aug 30, 2024 pm 04:26 PM

    Guide du numéro Armstrong en Java. Nous discutons ici d'une introduction au numéro d'Armstrong en Java ainsi que d'une partie du code.

    Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

    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.

    Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

    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.

    Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

    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.

    Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

    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

    See all articles