在Java編程中,生產者和消費者模式是一種常見的設計模式。這種模式一般用于解決線程間通信的問題,使得生產者產生的數據能夠被消費者及時地獲取和處理。
在這種模式中,生產者和消費者是兩個不同的線程,它們之間通過共享內存區域來實現數據的交換。生產者負責生產數據并將其存儲到共享區域,而消費者則從共享區域獲取數據并進行處理。為了防止多個線程同時訪問共享區域而產生沖突,需要使用鎖或者信號量進行加鎖和解鎖操作。
//Java中使用鎖和條件變量實現生產者和消費者模式的示例代碼如下: import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ProducerConsumer { private Queuequeue = new LinkedList<>(); private final int CAPACITY = 5; private Lock lock = new ReentrantLock(); private Condition notEmpty = lock.newCondition(); private Condition notFull = lock.newCondition(); private void produce(int num) throws InterruptedException { lock.lock(); try { while (queue.size() == CAPACITY) { notFull.await(); } queue.offer(num); System.out.println("Produced: " + num); notEmpty.signalAll(); } finally { lock.unlock(); } } private void consume() throws InterruptedException { lock.lock(); try { while (queue.isEmpty()) { notEmpty.await(); } int num = queue.poll(); System.out.println("Consumed: " + num); notFull.signalAll(); } finally { lock.unlock(); } } public static void main(String[] args) throws InterruptedException { ProducerConsumer pc = new ProducerConsumer(); Thread t1 = new Thread(() ->{ for (int i = 1; i<= 10; i++) { try { pc.produce(i); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread t2 = new Thread(() ->{ for (int i = 1; i<= 10; i++) { try { pc.consume(); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); t2.start(); t1.join(); t2.join(); } }
該示例代碼中,我們使用Lock和Condition來實現鎖和條件變量。lock.lock()和lock.unlock()分別表示鎖定和解鎖操作。notEmpty.await()和notFull.await()分別表示等待非空和等待非滿狀態。當生產者調用produce方法時,如果隊列已滿,則調用notFull.await()等待。當消費者調用consume方法時,如果隊列為空,則調用notEmpty.await()等待。當生產者將數據存入隊列后,調用notEmpty.signalAll()通知消費者,當消費者從隊列取出數據后,調用notFull.signalAll()通知生產者。