Java中的生產者和消費者模式是一種常見的多線程編程模式,主要用于解決生產者和消費者在共享的緩沖區中進行數據交互時的同步問題。
在這個模式中,生產者負責生成數據并將其存放到緩沖區中,而消費者則負責從緩沖區中取出數據并進行處理。為了避免生產者和消費者之間的競爭和沖突,需要采用合適的同步機制來確保生產者和消費者之間的數據交互是安全可靠的。
// 生產者線程 class Producer extends Thread { private final Listbuffer; private final int capacity; public Producer(List buffer, int capacity) { this.buffer = buffer; this.capacity = capacity; } @Override public void run() { for (int i = 0; i< 10; i++) { synchronized (buffer) { // 加鎖 while (buffer.size() == capacity) { // 如果緩存滿了 try { buffer.wait(); // 等待消費者通知 } catch (InterruptedException e) { e.printStackTrace(); } } buffer.add(i); // 添加數據 buffer.notifyAll(); // 通知消費者 System.out.println("Produced: " + i); } } } } // 消費者線程 class Consumer extends Thread { private final List buffer; public Consumer(List buffer) { this.buffer = buffer; } @Override public void run() { while (true) { synchronized (buffer) { // 加鎖 while (buffer.isEmpty()) { // 如果緩存為空 try { buffer.wait(); // 等待生產者通知 } catch (InterruptedException e) { e.printStackTrace(); } } int value = buffer.remove(0); // 取出數據 buffer.notifyAll(); // 通知生產者 System.out.println("Consumed: " + value); } } } } // 主函數 public class Main { public static void main(String[] args) { List buffer = new ArrayList<>(); int capacity = 5; Producer producer = new Producer(buffer, capacity); Consumer consumer = new Consumer(buffer); producer.start(); consumer.start(); } }
在上述代碼中,生產者線程和消費者線程分別采用了synchronized關鍵字來保證同步,通過wait和notifyAll方法來實現線程互斥和通信。其中,生產者線程在緩沖區滿時會等待,消費者線程在緩沖區為空時會等待,而當生產者添加數據或消費者取出數據時,都會通過notifyAll方法通知對方。
總的來說,Java中的生產者和消費者模式是一種非常常見的多線程編程模式,通過合適的同步機制可以有效地解決生產者和消費者之間的同步問題,提高程序的穩定性和可靠性。
下一篇css中讓控件靠左