Rumah  >  Artikel  >  Java  >  Perbincangan mendalam tentang kes aplikasi praktikal menunggu dan memberitahu dalam Java: Penjelasan terperinci tentang komunikasi antara benang

Perbincangan mendalam tentang kes aplikasi praktikal menunggu dan memberitahu dalam Java: Penjelasan terperinci tentang komunikasi antara benang

WBOY
WBOYasal
2023-12-20 08:58:451182semak imbas

Perbincangan mendalam tentang kes aplikasi praktikal menunggu dan memberitahu dalam Java: Penjelasan terperinci tentang komunikasi antara benang

Komunikasi antara benang dalam Java: Penjelasan terperinci tentang senario aplikasi praktikal menunggu dan memberitahu

Dalam pengaturcaraan berbilang benang, komunikasi antara utas ialah teknologi penting. Java menyediakan dua kaedah asas komunikasi antara benang, iaitu menggunakan kaedah menunggu dan memberitahu objek. Artikel ini akan menganalisis senario aplikasi sebenar menunggu dan memberitahu secara terperinci serta memberikan contoh kod khusus.

  1. Pengenalan

Dalam pengaturcaraan berbilang benang, komunikasi antara benang merujuk kepada kerjasama antara berbilang benang untuk menyelesaikan tugas tertentu. Benang selalunya perlu berkongsi pembolehubah, data atau sumber, dan mekanisme diperlukan untuk memastikan penyegerakan dan susunan. Java menyediakan cara untuk melaksanakan komunikasi antara benang berdasarkan pemantau objek, iaitu, menggunakan kaedah tunggu dan maklumkan objek.

  1. Pengenalan untuk menunggu dan memberitahu kaedah

Kaedah tunggu ialah kaedah dalam kelas Objek, yang meletakkan benang semasa ke dalam keadaan menunggu dan melepaskan kunci objek. Kaedah ini perlu dipanggil dalam blok kod disegerakkan atau kaedah disegerakkan, dan hanya boleh dipanggil oleh benang yang memegang kunci objek. Kaedah tunggu biasanya digunakan bersama dengan kaedah pemberitahuan untuk melaksanakan mekanisme menunggu dan bangun benang.

Kaedah pemberitahuan ialah kaedah dalam kelas Objek, yang digunakan untuk membangunkan benang menunggu. Kaedah pemberitahuan perlu dipanggil dalam blok kod disegerakkan atau kaedah disegerakkan, dan hanya boleh dipanggil oleh benang yang memegang kunci objek. Kaedah pemberitahuan secara rawak membangunkan utas menunggu dan meletakkannya dalam keadaan sedia.

  1. Senario aplikasi praktikal menunggu dan memberitahu

Berikut ialah beberapa senario penggunaan biasa, menunjukkan cara menggunakan kaedah tunggu dan pemberitahuan untuk mencapai komunikasi antara utas.

3.1 Model Pengeluar-Pengguna

Model pengeluar-pengguna ialah masalah penyegerakan utas klasik, di mana satu atau lebih utas bertindak sebagai pengeluar, menjana data dan memasukkannya ke dalam penimbal dikongsi yang lain Atau berbilang utas bertindak sebagai pengguna, mengambil data daripada penimbal dan memprosesnya. Di bawah model ini, komunikasi diperlukan antara pengeluar dan pengguna untuk memastikan pengeluar menunggu apabila penimbal penuh dan pengguna menunggu apabila penimbal kosong.

Berikut ialah contoh mudah yang menunjukkan cara melaksanakan model pengeluar-pengguna menggunakan kaedah tunggu dan maklumkan:

public class ProducerConsumerExample {
    private List<Integer> buffer = new ArrayList<>();
    private int maxSize = 5;

    public synchronized void produce() throws InterruptedException {
        while (buffer.size() == maxSize) {
            wait();
        }

        Random random = new Random();
        int value = random.nextInt(100);
        buffer.add(value);
        System.out.println("Produced: " + value);

        notifyAll();
    }

    public synchronized void consume() throws InterruptedException {
        while (buffer.size() == 0) {
            wait();
        }

        int value = buffer.remove(0);
        System.out.println("Consumed: " + value);

        notifyAll();
    }
}

Dalam contoh ini, kelas ProducerConsumerExample melaksanakan logik pengeluar dan pengguna. Dalam kaedah menghasilkan, jika penimbal penuh, utas memasuki keadaan menunggu (memanggil kaedah tunggu) sehingga pengguna menggunakan data dan memanggil kaedah notifyAll untuk membangunkan utas pengeluar menunggu. Begitu juga, dalam kaedah penggunaan, jika penimbal kosong, utas memasuki keadaan menunggu sehingga pengeluar menghasilkan data dan memanggil kaedah notifyAll untuk membangunkan utas pengguna yang menunggu. . Dalam senario ini, anda juga boleh menggunakan kaedah tunggu dan maklumkan untuk mencapai kerjasama rangkaian.

Berikut ialah contoh mudah yang menunjukkan cara menggunakan kaedah tunggu dan pemberitahuan untuk mencapai kerjasama rangkaian:

public class ThreadCooperationExample {
    private boolean isTask1Completed = false;

    public synchronized void task1() throws InterruptedException {
        while (!isTask1Completed) {
            wait();
        }

        System.out.println("Task 1 completed");
    }

    public synchronized void task2() {
        System.out.println("Task 2 started");

        // 执行任务2的代码

        isTask1Completed = true;
        notify();
    }
}

Dalam contoh ini, kelas ThreadCooperationExample melaksanakan dua tugasan task1 dan task2. Dalam tugas1, utas akan terus menyemak status isTask1Completed Jika ia palsu, ia akan memasuki keadaan menunggu (panggil kaedah tunggu) sehingga tugas2 menetapkan isTask1Completed kepada benar dan kemudian memanggil kaedah pemberitahuan untuk membangunkan utas tugas1 menunggu.

Ringkasan

    Artikel ini memperkenalkan senario aplikasi praktikal menunggu dan kaedah pemberitahuan secara terperinci, dan memberikan contoh kod khusus. Seperti yang dapat kita lihat, kaedah tunggu dan pemberitahuan dapat merealisasikan komunikasi dan kerjasama antara utas dalam pengaturcaraan berbilang benang, memastikan susunan dan penyegerakan utas. Dalam pembangunan sebenar, mengikut keperluan yang berbeza, kami boleh menggunakan kaedah menunggu dan memberitahu secara fleksibel untuk menulis aplikasi berbilang benang yang cekap dan boleh dipercayai.

Atas ialah kandungan terperinci Perbincangan mendalam tentang kes aplikasi praktikal menunggu dan memberitahu dalam Java: Penjelasan terperinci tentang komunikasi antara benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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