Jadual Kandungan
Definisi
Contoh CountDownLatch
Rumah Java javaTutorial Bagaimana untuk menentukan pembilang Java CountDownLatch dan penghalang kitaran CyclicBarrier

Bagaimana untuk menentukan pembilang Java CountDownLatch dan penghalang kitaran CyclicBarrier

May 21, 2023 pm 06:25 PM
java cyclicbarrier countdownlatch

Definisi

CountDownLatch: Alat bantuan penyegerakan yang membenarkan satu atau lebih urutan menunggu sehingga satu set operasi yang dijalankan dalam urutan lain selesai.

CyclicBarrier: Bantuan penyegerakan yang membolehkan satu set utas kepada semua menunggu antara satu sama lain untuk mencapai titik halangan yang sama.

Di atas ialah takrifan rasmi Oracle. Ringkasnya

CountDownLatch: Counter yang membenarkan satu atau lebih utas menunggu sehingga satu set operasi yang dilakukan dalam urutan lain selesai.

Penghalang Kitaran: Penghalang Kitaran, yang membenarkan sekumpulan utas menunggu antara satu sama lain untuk mencapai titik halangan yang sama.

Perbezaan

  • CountDownLatch ialah ahli AQS (AbstractQueuedSynchronizer), tetapi CyclicBarrier tidak.

  • Dalam senario penggunaan CountDownLatch, terdapat dua jenis utas, satu ialah utas menunggu yang memanggil kaedah await() dan satu lagi ialah utas operasi yang memanggil countDownl () kaedah. Dalam konteks CyclicBarrier, semua utas ialah utas yang menunggu antara satu sama lain dan daripada jenis yang sama.

  • CountDownLatch ialah kiraan turun, ia tidak boleh ditetapkan semula selepas penurunan, CyclicBarrier ialah kiraan naik, ia ditetapkan semula secara automatik selepas kenaikan

Contoh CountDownLatch

Buat dua kumpulan benang, satu kumpulan menunggu kumpulan lain selesai melaksanakan sebelum meneruskan

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();
Salin selepas log masuk

Cetak:

lari..
lari..
lari ..
lari..
lari..
tunggu..
tunggu..
tunggu..

Tunggu untuk utas pengumpulan selesai melaksanakan, dan kemudian utas utama Keluarkan hasil terkumpul

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());
    }
}
Salin selepas log masuk

Cetak:

997

3 Simulasi konkurensi

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();
Salin selepas log masuk

Cetak:

【pool-2-thread-2】Mulakan pelaksanaan……
【pool-2-thread-5】Mulakan pelaksanaan…&hellip>;<🎜 【pool-2-thread-3】Mulakan pelaksanaan&hellip ;…
[pool-2-thread-1] memulakan pelaksanaan……
[pool-2-thread-4] memulakan pelaksanaan……

Contoh CyclicBarrier

Semua utas menunggu antara satu sama lain sehingga langkah tertentu selesai sebelum meneruskan

        final int totalThread = 3;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i &lt; totalThread; i++) {
            executorService.execute(() -&gt; {
                System.out.println(&quot;before..&quot;);
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println(&quot;after..&quot;);
            });
        }
        executorService.shutdown();
Salin selepas log masuk
Cetak:

sebelum..

sebelum..
sebelum ..
selepas..
selepas..
selepas..

Atas ialah kandungan terperinci Bagaimana untuk menentukan pembilang Java CountDownLatch dan penghalang kitaran CyclicBarrier. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Akar Kuasa Dua di Jawa Akar Kuasa Dua di Jawa Aug 30, 2024 pm 04:26 PM

Akar Kuasa Dua di Jawa

Nombor Sempurna di Jawa Nombor Sempurna di Jawa Aug 30, 2024 pm 04:28 PM

Nombor Sempurna di Jawa

Penjana Nombor Rawak di Jawa Penjana Nombor Rawak di Jawa Aug 30, 2024 pm 04:27 PM

Penjana Nombor Rawak di Jawa

Nombor Armstrong di Jawa Nombor Armstrong di Jawa Aug 30, 2024 pm 04:26 PM

Nombor Armstrong di Jawa

Weka di Jawa Weka di Jawa Aug 30, 2024 pm 04:28 PM

Weka di Jawa

Nombor Smith di Jawa Nombor Smith di Jawa Aug 30, 2024 pm 04:28 PM

Nombor Smith di Jawa

Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

Soalan Temuduga Java Spring

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

Cuti atau kembali dari Java 8 Stream Foreach?

See all articles