Rumah > Java > javaTutorial > Bagaimanakah `wait()` dan `notify()` Boleh Digunakan untuk Melaksanakan Baris Menyekat di Java?

Bagaimanakah `wait()` dan `notify()` Boleh Digunakan untuk Melaksanakan Baris Menyekat di Java?

Patricia Arquette
Lepaskan: 2024-12-29 06:12:16
asal
866 orang telah melayarinya

How Can `wait()` and `notify()` Be Used to Implement a Blocking Queue in Java?

Menggunakan wait() dan notify() untuk Melaksanakan Barisan Menyekat

Pengenalan

Dalam pengaturcaraan berbilang benang, wait() dan notify() adalah digunakan untuk penyegerakan benang. Artikel ini menerangkan cara menggunakan wait() dan notify() untuk melaksanakan baris gilir menyekat, struktur data yang membenarkan utas disekat sehingga item tersedia atau ruang tersedia.

Melaksanakan Baris Gilir Menyekat dengan tunggu( ) dan maklumkan()

Syarat untuk Menyekat:

  • kaedah put(): Sekat sehingga ada ruang kosong dalam baris gilir.
  • kaedah ambil(): Sekat sehingga terdapat elemen yang tersedia dalam baris gilir.

Jawa Kod:

public class BlockingQueue<T> {

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

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

    public synchronized void put(T element) throws InterruptedException {
        while (queue.size() == capacity) {
            wait();
        }

        queue.add(element);
        notify(); // notifyAll() for multiple producer/consumer threads
    }

    public synchronized T take() throws InterruptedException {
        while (queue.isEmpty()) {
            wait();
        }

        T item = queue.remove();
        notify(); // notifyAll() for multiple producer/consumer threads
        return item;
    }
}
Salin selepas log masuk

Pertimbangan Apabila Menggunakan wait() dan notify()

  • Kod Disegerakkan: Panggil tunggu() dan maklumkan() dalam kaedah atau blok yang disegerakkan.
  • While Loops: Gunakan gelung while dan bukannya pernyataan if untuk menyemak keadaan akibat bangun tidur palsu.

Pustaka Concurrency Java 1.5

Java 1.5 memperkenalkan perpustakaan concurrency yang menyediakan abstraksi peringkat lebih tinggi:

Baris Gilir Penyekatan Diubah Suai Pelaksanaan:

public class BlockingQueue<T> {

    private Queue<T> queue = new LinkedList<>();
    private int capacity;
    private Lock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();

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

    public void put(T element) throws InterruptedException {
        lock.lock();
        try {
            while (queue.size() == capacity) {
                notFull.await();
            }

            queue.add(element);
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public T take() throws InterruptedException {
        lock.lock();
        try {
            while (queue.isEmpty()) {
                notEmpty.await();
            }

            T item = queue.remove();
            notFull.signal();
            return item;
        } finally {
            lock.unlock();
        }
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah `wait()` dan `notify()` Boleh Digunakan untuk Melaksanakan Baris Menyekat di Java?. 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