Rumah > Java > javaTutorial > Bagaimana untuk menggunakan kelas CountDownLatch dari Java Concurrency Toolkit?

Bagaimana untuk menggunakan kelas CountDownLatch dari Java Concurrency Toolkit?

PHPz
Lepaskan: 2023-05-09 18:22:28
ke hadapan
1261 orang telah melayarinya

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

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("所有任务执行完毕...");
    }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan