Java如何通過執行緒解決生產者/消費者問題
阿新 • • 發佈:2020-10-12
生產者和消費者問題是執行緒模型中的經典問題:生產者和消費者在同一時間段內共用同一個儲存空間,如下圖所示
生產者向空間裡存放資料,而消費者取用資料,如果不加以協調可能會出現以下情況:
儲存空間已滿,而生產者佔用著它,消費者等著生產者讓出空間從而去除產品,生產者等著消費者消費產品,從而向空間中新增產品。互相等待,從而發生死鎖。
以下例項演示瞭如何通過執行緒解決生產者/消費者問題:
/* author by javaidea.com ProducerConsumerTest.java */ public class ProducerConsumerTest { public static void main(String[] args) { CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c,1); Consumer c1 = new Consumer(c,1); p1.start(); c1.start(); } } class CubbyHole { private int contents; private boolean available = false; public synchronized int get() { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; notifyAll(); return contents; } public synchronized void put(int value) { while (available == true) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true; notifyAll(); } } class Consumer extends Thread { private CubbyHole cubbyhole; private int number; public Consumer(CubbyHole c,int number) { cubbyhole = c; this.number = number; } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole.get(); System.out.println("消費者 #" + this.number+ " got: " + value); } } } class Producer extends Thread { private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c,int number) { cubbyhole = c; this.number = number; } public void run() { for (int i = 0; i < 10; i++) { cubbyhole.put(i); System.out.println("生產者 #" + this.number + " put: " + i); try { sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { } } } }
以上程式碼執行輸出結果為:
消費者 #1 got: 0
生產者 #1 put: 0
生產者 #1 put: 1
消費者 #1 got: 1
生產者 #1 put: 2
消費者 #1 got: 2
生產者 #1 put: 3
消費者 #1 got: 3
生產者 #1 put: 4
消費者 #1 got: 4
生產者 #1 put: 5
消費者 #1 got: 5
生產者 #1 put: 6
消費者 #1 got: 6
生產者 #1 put: 7
消費者 #1 got: 7
生產者 #1 put: 8
消費者 #1 got: 8
生產者 #1 put: 9
消費者 #1 got: 9
以上就是Java如何通過執行緒解決生產者/消費者問題的詳細內容,更多關於Java 解決生產者/消費者問題的資料請關注我們其它相關文章!