Java生產者和消費者模式是一種并發設計模式,旨在通過將一個或多個生產者與一個或多個消費者組合在一起,同時協調防止數據競爭和死鎖,從而實現數據交換
在Java中,生產者和消費者之間的數據傳遞通常通過使用共享緩沖區來實現。生產者將制造的數據存儲在緩沖區中,而消費者會從緩沖區中讀取數據。這種方法可以有效地控制數據流,從而避免競爭和死鎖。
以下是一個簡單的Java生產者和消費者的示例代碼:
public class Buffer { private int contents; private boolean available = false; public synchronized int get() { while (!available) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } available = false; notifyAll(); return contents; } public synchronized void put(int value) { while (available) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } contents = value; available = true; notifyAll(); } } public class Producer extends Thread { private Buffer buffer; public Producer(Buffer buffer) { this.buffer = buffer; } public void run() { for (int i = 1; i<= 10; i++) { buffer.put(i); System.out.println("Producer produced " + i); try { sleep((int) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Consumer extends Thread { private Buffer buffer; public Consumer(Buffer buffer) { this.buffer = buffer; } public void run() { for (int i = 1; i<= 10; i++) { int value = buffer.get(); System.out.println("Consumer consumed " + value); try { sleep((int) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { Buffer buffer = new Buffer(); Producer producer = new Producer(buffer); Consumer consumer = new Consumer(buffer); producer.start(); consumer.start(); } }
這段示例代碼中,Buffer類用于實現緩沖區。生產者Producer和消費者Consumer是兩個線程,Producer線程生產從1到10的整數數據并將它們存儲到Buffer中,而Consumer線程從Buffer中讀取數據并將其消耗掉。
在代碼示例中,Buffer類的put()和get()方法都使用synchronized關鍵字修飾,這樣可以確保緩沖區中的數據只能由一個線程進行讀取或寫入操作。此外,這兩個方法都使用了wait()和notifyAll()方法來防止死鎖和數據競爭。wait()方法將線程掛起,直到條件滿足;notifyAll()方法則喚醒所有等待在該條件上的線程。
最后,在Main類中創建了Buffer、Producer和Consumer對象,并在兩個線程中啟動它們。
上一篇css中距離上面多遠
下一篇css中邊框里加文字