cari
RumahJavajavaTutorialBagaimana untuk menggunakan kelas CountDownLatch dari Java Concurrency Toolkit?

CountDownLatch ialah kelas alat yang sangat praktikal dalam pakej serentak Java, yang boleh membantu kami mencapai penyegerakan dan kerjasama antara urutan. Idea teras CountDownLatch adalah untuk mengawal susunan pelaksanaan benang melalui kaunter. Apabila nilai pembilang turun kepada 0, semua benang menunggu akan dibangkitkan dan kemudian mula melakukan operasi seterusnya.

1. Tafsiran kod sumber CountDownLatch

Di Java, pelaksanaan CountDownLatch adalah berdasarkan kelas AbstractQueuedSynchronizer. AbstractQueuedSynchronizer ialah penyegerak yang sangat penting dalam Java yang dilaksanakan berdasarkannya, seperti Semaphore, ReentrantLock, ReadWriteLock, dll.

Kelas pelaksanaan teras CountDownLatch ialah Sync, iaitu kelas dalaman yang diwarisi daripada AbstractQueuedSynchronizer. Berikut ialah kod sumber kelas Sync:

private static final class Sync extends AbstractQueuedSynchronizer {
    Sync(int count) {
        setState(count);
    }

    int getCount() {
        return getState();
    }

    protected int tryAcquireShared(int acquires) {
        return (getState() == 0) ? 1 : -1;
    }

    protected boolean tryReleaseShared(int releases) {
        for (;;) {
            int c = getState();
            if (c == 0)
                return false;
            int nextc = c-1;
            if (compareAndSetState(c, nextc))
                return nextc == 0;
        }
    }
}

Terdapat tiga kaedah penting dalam kelas Sync:

  • tryAcquireShared(int acquires): Cuba dapatkan kunci, jika nilai pembilang adalah sama dengan 0, menunjukkan bahawa semua utas telah menyelesaikan pelaksanaan, mengembalikan 1, jika tidak -1 dikembalikan, menunjukkan kegagalan untuk memperoleh kunci.

  • tryReleaseShared(int releases): Lepaskan kunci, kurangkan nilai pembilang sebanyak 1 dan kembalikan nilai pembilang selepas pengurangan 1. Jika nilai pembilang berkurangan kepada 0, ini bermakna semua utas telah menyelesaikan pelaksanaan dan mengembalikan benar, jika tidak ia mengembalikan palsu.

  • getCount(): Mengembalikan nilai pembilang semasa.

kaedah tryAcquireShared() ialah kunci kepada CountDownLatch, ia akan cuba memperoleh kunci. Jika nilai pembilang adalah sama dengan 0, ini bermakna semua utas telah menyelesaikan pelaksanaan, dan 1 boleh dikembalikan, menunjukkan bahawa pemerolehan kunci berjaya jika tidak -1 dikembalikan, menunjukkan bahawa pemerolehan kunci gagal. Kaedah asas kelas AbstractQueuedSynchronizer digunakan di sini, iaitu kaedah getState(), yang digunakan untuk mendapatkan status penyegerak.

kaedah tryReleaseShared() digunakan untuk melepaskan kunci, mengurangkan nilai pembilang sebanyak 1 dan mengembalikan nilai pembilang selepas mengurangkan 1. Jika nilai pembilang berkurangan kepada 0, ini bermakna semua utas telah menyelesaikan pelaksanaan dan mengembalikan benar, jika tidak ia mengembalikan palsu. Kaedah asas kelas AtomicInteger digunakan di sini, iaitu kaedah compareAndSetState(), yang digunakan untuk membandingkan dan menetapkan status penyegerak.

2. Analisis prinsip CountDownLatch

Prinsip kerja CountDownLatch adalah sangat mudah. ​​Ia menggunakan pembilang untuk mengawal susunan pelaksanaan utas. Apabila nilai pembilang turun kepada 0, semua benang menunggu akan dibangkitkan dan kemudian mula melakukan operasi seterusnya.

CountDownLatch ialah kelas alat kolaborasi berbilang benang yang membenarkan satu atau lebih urutan menunggu sehingga urutan lain menyelesaikan operasi sebelum meneruskan pelaksanaan. CountDownLatch mempunyai pembilang Apabila nilai pembilang menjadi 0, benang menunggu akan dibangkitkan. Penggunaan CountDownLatch adalah sangat mudah, terutamanya termasuk dua kaedah: await() dan countDown().

  • kaedah tunggu(): Kaedah ini menyekat urutan semasa sehingga nilai pembilang menjadi 0.

  • kaedah countdown(): Kaedah ini akan mengurangkan nilai pembilang sebanyak 1.

Berikut ialah kod sampel ringkas:

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        final int count = 3;
        final CountDownLatch latch = new CountDownLatch(count);

        for (int i = 0; i < count; i++) {
            new Thread(() -> {
                // 线程执行任务
                System.out.println(Thread.currentThread().getName() + " 执行任务...");
                // 任务执行完毕,计数器减1
                latch.countDown();
            }).start();
        }

        // 等待所有任务执行完毕
        latch.await();
        System.out.println("所有任务执行完毕...");
    }
}

Dalam kod sampel ini, kami mencipta objek CountDownLatch dan memulakan pembilang kepada 3. Kemudian 3 utas dicipta, setiap utas menjalankan tugas Selepas tugasan selesai, kaunter dikurangkan sebanyak 1. Akhir sekali, panggil kaedah latch.await() dalam utas utama untuk menunggu semua tugasan selesai.

Prinsip pelaksanaan CountDownLatch adalah berdasarkan kelas AbstractQueuedSynchronizer. Apabila kita memanggil kaedah await(), benang akan cuba memperoleh kunci Jika nilai pembilang bukan 0, memperoleh kunci akan gagal dan benang akan ditambahkan pada baris gilir penyegerakan dan disekat. Apabila kita memanggil kaedah countDown(), nilai pembilang akan dikurangkan sebanyak 1. Jika nilai pembilang dikurangkan kepada 0, ini bermakna semua utas telah menyelesaikan pelaksanaan Pada masa ini, utas dalam baris gilir penyegerakan akan dibangkitkan dan teruskan melakukan operasi seterusnya.

Khususnya, dalam kelas Sync, kaedah tryAcquireShared(int acquires) akan cuba memperoleh kunci Jika nilai pembilang adalah sama dengan 0, ini bermakna semua urutan telah menyelesaikan pelaksanaan dan mengembalikan 1. Jika tidak, ia mengembalikan -1, yang bermaksud Gagal memperoleh kunci. Kaedah tryReleaseShared(int releases) digunakan untuk melepaskan kunci, mengurangkan nilai pembilang sebanyak 1, dan mengembalikan nilai pembilang selepas mengurangkan 1. Jika nilai pembilang berkurangan kepada 0, ini bermakna semua utas telah menyelesaikan pelaksanaan dan mengembalikan benar, jika tidak ia mengembalikan palsu.

3. Senario aplikasi CountDownLatch

CountDownLatch ialah kelas alat yang sangat praktikal yang boleh membantu kami mencapai penyegerakan dan kerjasama antara urutan. Berikut ialah beberapa senario aplikasi biasa untuk CountDownLatch:

  • Menunggu beberapa utas selesai: Jika terdapat berbilang utas yang perlu dilaksanakan, tetapi anda mesti menunggu sehingga semua utas selesai sebelum meneruskan ke langkah seterusnya. Ini boleh dicapai menggunakan CountDownLatch. Kita boleh mencipta objek CountDownLatch dan memulakan nilai pembilang kepada bilangan utas Selepas setiap utas menyelesaikan pelaksanaan, panggil kaedah countDown() untuk mengurangkan pembilang sebanyak 1. Akhir sekali, panggil kaedah await() dalam utas utama untuk menunggu semua utas menyelesaikan pelaksanaan.

  • Kawal susunan pelaksanaan utas: Jika terdapat berbilang utas yang perlu dilaksanakan dalam susunan tertentu, anda boleh menggunakan CountDownLatch untuk mencapai ini. Kita boleh mencipta berbilang objek CountDownLatch, dan nilai pembilang bagi setiap objek ialah 1, menunjukkan bahawa hanya satu utas boleh dilaksanakan. Selepas urutan menyelesaikan pelaksanaan, panggil kaedah countDown() objek CountDownLatch seterusnya untuk membangunkan urutan seterusnya.

  • Menunggu peristiwa luaran berlaku: Jika kita perlu menunggu peristiwa luaran berlaku, seperti penubuhan sambungan rangkaian atau selesai membaca fail, kita boleh gunakan CountDownLatch untuk mencapai ini. Kita boleh mencipta objek CountDownLatch dalam utas utama, mulakan nilai pembilang kepada 1, dan kemudian tunggu acara luaran berlaku dalam utas lain. Apabila peristiwa luaran berlaku, panggil kaedah countDown() objek CountDownLatch untuk membangunkan utas utama untuk meneruskan pelaksanaan.

  • Kawal bilangan utas serentak: Jika kita perlu mengawal bilangan utas serentak, kita boleh menggunakan CountDownLatch untuk mencapainya. Kita boleh mencipta objek CountDownLatch dan memulakan nilai pembilang kepada bilangan utas Selepas setiap utas menyelesaikan pelaksanaan, panggil kaedah countDown() untuk mengurangkan pembilang sebanyak 1. Jika benang perlu menunggu urutan lain untuk menyelesaikan pelaksanaan, ia boleh memanggil kaedah await() untuk menunggu nilai pembilang menjadi 0.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan kelas CountDownLatch dari Java Concurrency Toolkit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:亿速云. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Bagaimanakah JVM menguruskan koleksi sampah di platform yang berbeza?Bagaimanakah JVM menguruskan koleksi sampah di platform yang berbeza?Apr 28, 2025 am 12:23 AM

JVMmanagesgarbagecollectionacrossplatformseffectivelybyusingagenerationalapproachandadaptingtoOSandhardwaredifferences.ItemploysvariouscollectorslikeSerial,Parallel,CMS,andG1,eachsuitedfordifferentscenarios.Performancecanbetunedwithflagslike-XX:NewRa

Mengapa kod Java boleh dijalankan pada sistem pengendalian yang berbeza tanpa pengubahsuaian?Mengapa kod Java boleh dijalankan pada sistem pengendalian yang berbeza tanpa pengubahsuaian?Apr 28, 2025 am 12:14 AM

Kod Java boleh dijalankan pada sistem pengendalian yang berbeza tanpa pengubahsuaian, kerana falsafah "Write Once, Run, Everywhere" Java dilaksanakan oleh Java Virtual Machine (JVM). Oleh kerana perantara antara bytecode Java yang disusun dan sistem operasi, JVM menerjemahkan bytecode ke dalam arahan mesin tertentu untuk memastikan program itu dapat dijalankan secara bebas di mana -mana platform dengan JVM dipasang.

Huraikan proses menyusun dan melaksanakan program Java, menonjolkan kebebasan platform.Huraikan proses menyusun dan melaksanakan program Java, menonjolkan kebebasan platform.Apr 28, 2025 am 12:08 AM

Penyusunan dan pelaksanaan program Java mencapai kemerdekaan platform melalui Bytecode dan JVM. 1) Tulis kod sumber Java dan menyusunnya ke dalam bytecode. 2) Gunakan JVM untuk melaksanakan bytecode pada mana -mana platform untuk memastikan kod berjalan di seluruh platform.

Bagaimanakah seni bina perkakasan yang mendasari mempengaruhi prestasi Java?Bagaimanakah seni bina perkakasan yang mendasari mempengaruhi prestasi Java?Apr 28, 2025 am 12:05 AM

Prestasi Java berkait rapat dengan seni bina perkakasan, dan memahami hubungan ini dapat meningkatkan keupayaan pengaturcaraan dengan ketara. 1) JVM menukarkan bytecode Java ke dalam arahan mesin melalui kompilasi JIT, yang dipengaruhi oleh seni bina CPU. 2) Pengurusan memori dan koleksi sampah dipengaruhi oleh RAM dan kelajuan bas memori. 3) Ramalan cache dan cawangan mengoptimumkan pelaksanaan kod Java. 4) Pemprosesan pelbagai threading dan selari meningkatkan prestasi pada sistem multi-teras.

Jelaskan mengapa perpustakaan asli boleh memecahkan kemerdekaan platform Java.Jelaskan mengapa perpustakaan asli boleh memecahkan kemerdekaan platform Java.Apr 28, 2025 am 12:02 AM

Menggunakan perpustakaan asli akan memusnahkan kemerdekaan platform Java, kerana perpustakaan ini perlu dikumpulkan secara berasingan untuk setiap sistem operasi. 1) Perpustakaan asli berinteraksi dengan Java melalui JNI, menyediakan fungsi yang tidak dapat dilaksanakan secara langsung oleh Java. 2) Menggunakan perpustakaan asli meningkatkan kerumitan projek dan memerlukan menguruskan fail perpustakaan untuk platform yang berbeza. 3) Walaupun perpustakaan asli dapat meningkatkan prestasi, mereka harus digunakan dengan berhati-hati dan menjalankan ujian silang platform.

Bagaimanakah JVM mengendalikan perbezaan dalam sistem operasi API?Bagaimanakah JVM mengendalikan perbezaan dalam sistem operasi API?Apr 27, 2025 am 12:18 AM

JVM Mengendalikan Perbezaan API Sistem Operasi melalui JavanativeInterface (JNI) dan Perpustakaan Standard Java: 1. JNI membenarkan kod Java untuk memanggil kod tempatan dan terus berinteraksi dengan API Sistem Operasi. 2. Perpustakaan Standard Java menyediakan API bersatu, yang dipetakan secara dalaman kepada API sistem operasi yang berbeza untuk memastikan kod tersebut berjalan di seluruh platform.

Bagaimanakah modulariti yang diperkenalkan dalam kemerdekaan platform kesan Java 9?Bagaimanakah modulariti yang diperkenalkan dalam kemerdekaan platform kesan Java 9?Apr 27, 2025 am 12:15 AM

modularitydoesnotdirectlyaffectjava'splatformindected.java'splatformindectenceismaintybythejvm, butmodularityinfluencesapplicationstructureandManagement, indirectlyimpactingplatformindect.1) DeploymentandmentandmentweMbecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecom

Apakah bytecode, dan bagaimanakah ia berkaitan dengan kemerdekaan platform Java?Apakah bytecode, dan bagaimanakah ia berkaitan dengan kemerdekaan platform Java?Apr 27, 2025 am 12:06 AM

BytecodeinjavaistheintermediaterepresentationThateNableSplatformindant.1) javacodeiscompiledintobytecodestoredin.classfiles.2)

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod