Rumah > Java > javaTutorial > Bagaimanakah Kaedah `wait()` dan `notify()` Java Melaksanakan Baris Menyekat?

Bagaimanakah Kaedah `wait()` dan `notify()` Java Melaksanakan Baris Menyekat?

Patricia Arquette
Lepaskan: 2024-11-23 05:56:16
asal
734 orang telah melayarinya

How Do Java's `wait()` and `notify()` Methods Implement a Blocking Queue?

tunggu() dan notify() dalam Java: Senario Mudah dengan Queue

Di Java, tunggu() dan notify() kaedah menyediakan mekanisme untuk penyegerakan benang. Mari kita terokai senario mudah di mana kaedah ini boleh digunakan untuk melaksanakan baris gilir menyekat.

Pelaksanaan Gilir Menyekat

Baris gilir menyekat ialah struktur data baris gilir yang menyekat urutan apabila cuba melakukan operasi tertentu jika syarat tertentu tidak dipenuhi. Dalam pelaksanaan kami, kami akan melaksanakan kaedah put() dan take(), yang akan menyekat jika baris gilir penuh atau kosong, masing-masing.

public class BlockingQueue<T> {

    private Queue<T> queue = new LinkedList<>();
    private int capacity;

    public BlockingQueue(int capacity) {
        this.capacity = capacity;
    }

    // Blocks if the queue is full (no space to insert)
    public synchronized void put(T element) throws InterruptedException {
        while (queue.size() == capacity) {
            wait();
        }

        queue.add(element);
        notifyAll();
    }

    // Blocks if the queue is empty (nothing to remove)
    public synchronized T take() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }

        T item = queue.remove();
        notifyAll();
        return item;
    }
}
Salin selepas log masuk

Penggunaan

Sekarang, mari lihat cara menggunakan baris gilir menyekat ini.

BlockingQueue<Integer> queue = new BlockingQueue<>(10);

// Producer thread: adds elements to the queue
new Thread(() -> {
    for (int i = 0; i < 15; i++) {
        try {
            queue.put(i);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

// Consumer thread: retrieves elements from the queue
new Thread(() -> {
    for (int i = 0; i < 15; i++) {
        try {
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();
Salin selepas log masuk

Dalam contoh ini, urutan pengeluar akan menambah elemen ke baris gilir, menyekat apabila ia mencapai had kapasiti. Urutan pengguna akan mendapatkan semula elemen, menyekat apabila baris gilir kosong.

Pertimbangan Utama

  • Gunakan blok yang disegerakkan: tunggu() dan notify() mesti digunakan dalam blok yang disegerakkan untuk memastikan keselamatan benang dan mengelakkan terlepas isyarat.
  • Gunakan gelung sementara: Gunakan gelung sementara untuk menyemak keadaan kerana bangun tidur palsu (apabila urutan diaktifkan semula tanpa dimaklumkan).
  • Pertimbangkan perpustakaan concurrency Java 1.5: Java 1.5 memperkenalkan perpustakaan concurrency dengan abstraksi peringkat lebih tinggi (cth., Kunci dan Keadaan). Ia menawarkan pendekatan yang lebih bersih dan serba boleh.

Atas ialah kandungan terperinci Bagaimanakah Kaedah `wait()` dan `notify()` Java Melaksanakan Baris Menyekat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan