java實現生產者和消費者 類比訊息中介軟體
阿新 • • 發佈:2021-09-01
一、對生產者消費者的理解
生產者消費者模式是併發、多執行緒程式設計中經典的設計模式。
簡單來看,就是一個類負責生產,一個類負責消費。舉例來說,一個變數,生產者不斷增加這個變數,消費者不斷減少這個變數。在網際網路應用中,搶票機制就是應用了該模式,比如大麥網演唱會門票搶票,12306火車票搶票等。
二、程式碼演示
下面使用程式碼來舉例理解:
有這樣一個場景:
生產者:往一個公共的盒子裡面放蘋果
消費者:從公共的盒子裡面取蘋果
盒子:盒子的容量不能超過5
我們將使用wait() 和 notify() 通訊方法實現
1.盒子程式碼
public class PublicBox {private int apple = 0; public synchronized void increace() { while (apple ==5) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } apple++; System. out .println("生成蘋果成功!" ); notify(); } public synchronized void decreace() { while (apple ==0) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } apple--; System. out.println( "消費蘋果成功!" ); notify(); } public static void main(String []args) { PublicBox box= new PublicBox(); Consumer con= new Consumer(box); Producer pro= new Producer(box); Thread t1= new Thread(con); Thread t2= new Thread(pro); t1.start(); t2.start(); } }
2.生產者程式碼(定義十次)
public class Producer implements Runnable { private PublicBox box; public Producer(PublicBox box) { this .box = box; } @Override public void run() { for( int i=0;i<10;i++) { try { System. out .println("pro i:" +i); Thread. sleep(30); } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } box.increace(); } } }
3.消費者程式碼(同樣十次)
public class Consumer implements Runnable { private PublicBox box; public Consumer(PublicBox box) { this .box = box; } @Override public void run() { for( int i=0;i<10;i++) { try { System. out .println("Con: i " +i); Thread. sleep(3000); // 這裡設定跟上面30不同是為了 盒子中的蘋果能夠增加,不會生產一個馬上被消費 } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } box.decreace(); } } }
4.輸出如下:
pro i:0
Con: i 0
生成蘋果成功!
pro i:1
生成蘋果成功!
pro i:2
生成蘋果成功!
pro i:3
生成蘋果成功!
pro i:4
生成蘋果成功!
pro i:5
消費蘋果成功!
Con: i 1
生成蘋果成功!
pro i:6
消費蘋果成功!
Con: i 2
生成蘋果成功!
pro i:7
消費蘋果成功!
生成蘋果成功!
pro i:8
Con: i 3
消費蘋果成功!
生成蘋果成功!
pro i:9
Con: i 4
消費蘋果成功!
生成蘋果成功!
Con: i 5
消費蘋果成功!
Con: i 6
消費蘋果成功!
Con: i 7
消費蘋果成功!
Con: i 8
消費蘋果成功!
Con: i 9
消費蘋果成功!
這個只是簡單地從執行緒的wait、nofity來實現生產者和消費者模式。目前比較流行的是使用訊息佇列的方法