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

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

Barbara Streisand
Lepaskan: 2024-11-23 09:42:31
asal
719 orang telah melayarinya

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

Menggunakan Wait() dan Notify() dalam Java: Senario dengan Baris Gilir

Soalan:

Bolehkah anda memberikan panduan menyeluruh tentang cara melaksanakan kaedah wait() dan notify() dengan Beratur?

Jawapan:

Prinsip Tunggu() dan Maklumkan()

Tunggu() dan maklumkan() dayakan penyelarasan benang dengan meminta benang menunggu syarat tertentu untuk dipenuhi sebelum meneruskan. Dalam kes ini, kami berminat untuk membuat baris gilir menyekat yang menguatkuasakan pengehadan kapasiti.

Pelaksanaan

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(); // Notify waiting threads
    }

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

        T item = queue.remove();
        notify(); // Notify waiting threads
        return item;
    }
}
Salin selepas log masuk

Cara Ia Berfungsi

  • Kaedah Letak(): Jika baris gilir penuh, urutan semasa menunggu sehingga ia menerima pemberitahuan bahawa ruang tersedia.
  • Kaedah Take(): Jika baris gilir kosong, utas semasa menunggu sehingga ia menerima pemberitahuan bahawa elemen tersedia.

Nota: Pastikan bahawa panggilan tunggu() dan notify() adalah disegerakkan pada objek yang sama dan diletakkan dalam gelung sementara untuk mengendalikan bangun tidur palsu.

Ciri Serentak Java 1.5

Java 1.5 memperkenalkan pakej java.util.concurrent , menyediakan abstraksi peringkat lebih tinggi untuk penyelarasan benang. Berikut ialah versi contoh yang dikemas kini:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

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

Pendekatan ini menggunakan kunci dan syarat untuk penyelarasan benang yang lebih baik.

Pertimbangkan Antara Muka BlockingQueue

Jika anda memerlukan baris gilir menyekat, pertimbangkan untuk menggunakan pelaksanaan antara muka Java BlockingQueue, yang menyediakan pelaksanaan standard dengan thread-safe dan operasi terkawal kapasiti.

Atas ialah kandungan terperinci Bagaimanakah Kaedah `wait()` dan `notify()` Java Boleh Digunakan untuk 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