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

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

Patricia Arquette
Patricia Arquetteasal
2024-11-23 05:56:16680semak imbas

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;
    }
}

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();

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!

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