1. 程式人生 > 其它 >java實現生產者和消費者 類比訊息中介軟體

java實現生產者和消費者 類比訊息中介軟體

一、對生產者消費者的理解

生產者消費者模式是併發、多執行緒程式設計中經典的設計模式。

簡單來看,就是一個類負責生產,一個類負責消費。舉例來說,一個變數,生產者不斷增加這個變數,消費者不斷減少這個變數。在網際網路應用中,搶票機制就是應用了該模式,比如大麥網演唱會門票搶票,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來實現生產者和消費者模式。目前比較流行的是使用訊息佇列的方法