Maison  >  Article  >  Java  >  Comment utiliser CyclicBarrier pour une concurrence élevée en Java

Comment utiliser CyclicBarrier pour une concurrence élevée en Java

PHPz
PHPzavant
2023-04-14 19:07:081098parcourir

CyclicBarrier en Java est un outil de synchronisation qui permet à plusieurs threads d'attendre au niveau d'une barrière jusqu'à ce que tous les threads atteignent la barrière avant de pouvoir continuer leur exécution. CyclicBarrier peut être utilisé pour coordonner l'exécution de plusieurs threads afin qu'ils puissent s'exécuter simultanément à un certain point.

CyclicBarrier est un outil de synchronisation en Java qui permet à plusieurs threads d'attendre à un point de barrière jusqu'à ce que tous les threads atteignent ce point avant de pouvoir continuer leur exécution. CyclicBarrier peut être utilisé pour coordonner l'exécution de plusieurs threads afin qu'ils puissent s'exécuter simultanément à un certain point.

Utilisation

L'utilisation de base de CyclicBarrier est la suivante :

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierExample {

    public static void main(String[] args) {
        int n = 3;
        CyclicBarrier barrier = new CyclicBarrier(n, new Runnable() {
            public void run() {
                System.out.println("All threads have reached the barrier");
            }
        });

        Thread t1 = new Thread(new MyRunnable(barrier), "Thread 1");
        Thread t2 = new Thread(new MyRunnable(barrier), "Thread 2");
        Thread t3 = new Thread(new MyRunnable(barrier), "Thread 3");

        t1.start();
        t2.start();
        t3.start();
    }

    static class MyRunnable implements Runnable {
        private final CyclicBarrier barrier;

        public MyRunnable(CyclicBarrier barrier) {
            this.barrier = barrier;
        }

        public void run() {
            try {
                System.out.println(Thread.currentThread().getName() + " is waiting at the barrier...");
                barrier.await();
                System.out.println(Thread.currentThread().getName() + " has crossed the barrier");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

Dans cet exemple, nous créons un objet CyclicBarrier, qui doit attendre 3 threads pour atteindre le point de barrière. Lorsque tous les threads atteignent le point de barrière, une fonction de rappel sera déclenchée et un message sera imprimé.

Nous créons 3 threads et les transmettons à un objet Runnable personnalisé. Dans la méthode d'exécution de chaque thread, nous imprimons d'abord un message indiquant que le thread attend le point de barrière. Appelez ensuite la méthode barrière.await() pour ajouter le thread à la file d'attente. L'exécution ne continuera pas tant que tous les threads n'auront pas atteint le point de barrière. A la fin, nous imprimons un message indiquant que le fil a franchi le point barrière.

Les résultats d'exécution du code ci-dessus sont les suivants :

Le fil 1 attend à la barrière...
Le fil 3 attend à la barrière...
Le fil 2 attend à la barrière...
Tous les threads ont atteint la barrière
Thread 2 a franchi la barrière
Thread 1 a franchi la barrière
Thread 3 a franchi la barrière

Comme le montre le code ci-dessus, CyclicBarrier prend également en charge une fonction de rappel facultative qui sera utilisée lorsque tous les threads arrivent Une fois le point de barrière atteint, la fonction de rappel spécifiée sera appelée. Dans l'exemple ci-dessus, lorsque tous les threads atteignent le point de barrière, la fonction de rappel sera exécutée pour indiquer que le point de barrière a été atteint.

CyclicBarrier prend également en charge une utilisation plus avancée, qui consiste à effectuer quelques opérations supplémentaires en attendant que le thread atteigne le point de barrière. Ceci peut être réalisé grâce à la valeur de retour de la méthode wait, comme indiqué ci-dessous :

int index = barrier.await();
if (index == 0) {
    // 执行额外的操作
}

Dans cet exemple, la valeur de retour de la méthode wait indique la position du thread dans la file d'attente. Si la valeur de retour est 0, elle. signifie que le thread actuel est le dernier. Un thread qui atteint le point de barrière peut effectuer certaines opérations supplémentaires, comme effectuer des travaux de finition tels que le nettoyage des données.

Remarques

Lorsque vous utilisez CyclicBarrier en Java, vous devez faire attention aux points suivants :

1. Le compteur de CyclicBarrier est réutilisable, c'est-à-dire que lorsque tous les threads atteignent le point de barrière, le compteur sera réinitialisé. valeur initiale et peut être réutilisé. Si une exception se produit pendant l'attente, le compteur sera réinitialisé et tous les threads en attente lanceront BrokenBarrierException.

2. Si le nombre de threads en attente dépasse la valeur initiale du compteur lors de l'utilisation de CyclicBarrier, tous les threads attendront indéfiniment. Par conséquent, lorsque vous utilisez CyclicBarrier, vous devez vous assurer que le nombre de threads en attente ne dépasse pas la valeur initiale du compteur.

3. La fonction de rappel de CyclicBarrier est exécutée lorsque le dernier thread atteint le point de barrière. Par conséquent, Les opérations effectuées dans la fonction de rappel doivent être thread-safe, sinon cela peut conduire à des résultats imprévisibles.

4. CyclicBarrier peut être utilisé pour coordonner l'exécution de plusieurs threads afin qu'ils puissent s'exécuter simultanément à un certain moment. **Cependant, si l'ordre d'exécution entre les threads est important pour l'exactitude de votre programme, alors CyclicBarrier n'est peut-être pas le meilleur choix. **Dans ce cas, il peut être nécessaire d'utiliser d'autres outils de synchronisation tels que CountDownLatch ou Semaphore.

5. Les performances de CyclicBarrier peuvent être affectées par le nombre de threads en attente et la valeur initiale du compteur. **Si le nombre de threads en attente est important ou si la valeur initiale du compteur est élevée, une dégradation des performances peut se produire. **Par conséquent, lors de l'utilisation de CyclicBarrier, il doit être ajusté en fonction de la situation réelle.

En bref, lors de l'utilisation de CyclicBarrier en Java, diverses situations doivent être soigneusement prises en compte pour garantir l'exactitude et les performances du programme.

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