Heim > Java > javaLernprogramm > Hauptteil

So definieren Sie den Java CountDownLatch-Zähler und die CyclicBarrier-Zyklusbarriere

WBOY
Freigeben: 2023-05-21 18:25:14
nach vorne
752 Leute haben es durchsucht

Definition

CountDownLatch: Eine Synchronisierungshilfe, die es einem oder mehreren Threads ermöglicht, zu warten, bis eine Reihe von Vorgängen, die in anderen Threads ausgeführt werden, abgeschlossen ist.

CyclicBarrier: Eine Synchronisationshilfe, die es einer Reihe von Threads ermöglicht, darauf zu warten, dass einander einen gemeinsamen Barrierenpunkt erreichen.

Das Obige ist die offizielle Definition von Oracle. Einfach ausgedrückt:

CountDownLatch: Zähler, der es einem oder mehreren Threads ermöglicht, zu warten, bis eine Reihe von in anderen Threads ausgeführten Vorgängen abgeschlossen ist.

CyclicBarrier: Zyklische Barriere, die es einer Gruppe von Threads ermöglicht, darauf zu warten, dass einander einen gemeinsamen Barrierenpunkt erreicht.

DIFFERENCE

  • CountDownLatch ist Mitglied von AQS (AbstractQueuedSynchronizer), CyclicBarrier jedoch nicht.

  • Im Verwendungsszenario von CountDownLatch gibt es zwei Arten von Threads: einer ist der wartende Thread, der die Methode „await()“ aufruft, und der andere ist die Operation, die ausgeführt wird ruft die countDownl()-Methode auf. Im Kontext von CyclicBarrier sind alle Threads Threads, die aufeinander warten und vom gleichen Typ sind.

  • CountDownLatch ist ein Abwärtszähler und kann nach dem Dekrementieren nicht zurückgesetzt werden und wird nach dem Inkrementieren automatisch zurückgesetzt.

  • #🎜 🎜## 🎜🎜#CountDownLatch-Beispiel

Erstellen Sie zwei Gruppen von Threads. Eine Gruppe wartet, bis die Ausführung der anderen Gruppe abgeschlossen ist, bevor sie fortfährt

CountDownLatch countDownLatch = new CountDownLatch(5);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
    executorService.execute(() -> {
        countDownLatch.countDown();
        System.out.println("run..");
    });
}
for (int i = 0; i < 3; i++) {  //我们要等上面执行完成才继续
    executorService.execute(() -> {
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("await..");
    });
}
executorService.shutdown();
Nach dem Login kopieren

Drucken:

# 🎜🎜##🎜 🎜#run..

run..

run..
run..

run..
await..
await ..#🎜🎜 #await..


Warten Sie, bis die Ausführung des Akkumulationsthreads abgeschlossen ist, und dann gibt der Hauptthread das Akkumulationsergebnis aus

public class ThreadUnsafeExample {
    private int cnt = 0;
    public void add() {
        cnt++;
    }
    public int get() {
        return cnt;
    }
    public static void main(String[] args) throws InterruptedException {
        final int threadSize = 1000;
        ThreadUnsafeExample example = new ThreadUnsafeExample();
        final CountDownLatch countDownLatch = new CountDownLatch(threadSize);
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < threadSize; i++) {
            executorService.execute(() -> {
                example.add();
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        System.out.println(example.get());
    }
}
Nach dem Login kopieren

Drucken:

#🎜🎜 #997

3 Parallelität simulieren

ExecutorService executorService = Executors.newCachedThreadPool();
        CountDownLatch countDownLatch = new CountDownLatch(1);
        for (int i = 0; i < 5; i++) {
            executorService.submit( () -> {
                try {
                    countDownLatch.await();
                    System.out.println("【" + Thread.currentThread().getName() + "】开始执行……");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        Thread.sleep(2000);
        countDownLatch.countDown();//开始并发
        executorService.shutdown();
Nach dem Login kopieren
Drucken:

#🎜 🎜 #【pool-2-thread-2】Ausführung starten...
【pool-2-thread-5】Ausführung starten... 2-thread-1】Ausführung starten... 🎜🎜#Alle Threads warten füreinander, bis ein bestimmter Schritt abgeschlossen ist, bevor die Ausführung fortgesetzt wird

        final int totalThread = 3;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < totalThread; i++) {
            executorService.execute(() -> {
                System.out.println("before..");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("after..");
            });
        }
        executorService.shutdown();
Nach dem Login kopieren
Drucken:

before..

before..# 🎜🎜#before ..
nach..
nach..
nach..

Das obige ist der detaillierte Inhalt vonSo definieren Sie den Java CountDownLatch-Zähler und die CyclicBarrier-Zyklusbarriere. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage