1. 程式人生 > >生產者-消費者模式實現

生產者-消費者模式實現

java 生產者 消費者

生產者是指:生產數據的線程
消費者是指:使用數據的線程
生產者和消費者是不同的線程,他們處理數據的速度是不一樣的,一般在二者之間還要加個“橋梁參與者”,用於緩沖二者之間處理數據的速度差。
下面用代碼來說明:
//生產者

public class MakerThread extends Thread {  
        private final Random random;  
        private final Table table;  
        private static int id = 0;   
        public MakerThread(String name, Table table, long seed) {  
                super(name);  
                this.table = table;//table就是橋梁參與者   
                this.random = new Random(seed);  
        }  
        public void run() {  
                try {  
                        while (true) {  
                                Thread.sleep(random.nextInt(1000));//生產數據要耗費時間   
                                //生產數據
                                String cake = "[ Cake No." + nextId() + " by " + getName() + " ]";   
                                table.put(cake);//將數據存入橋梁參與者   
                        }  
                } catch (InterruptedException e) {  
                }  
        }  
        private static synchronized int nextId() {  
                return id++;  
        }  
}  

再來看看消費者:
//消費者線程

public classEaterThread extends Thread {
        private final Random random;
        private final Table table;
        public EaterThread(String name, Table table,long seed) {
                super(name);
                this.table = table;
                this.random = new Random(seed);
        }
        public void run() {
                try {
                        while (true) {
                                String cake = table.take();//從橋梁參與者中取數據
                             Thread.sleep(random.nextInt(1000));//消費者消費數據要花時間
                        }
                } catch (InterruptedException e) {
                }
        }
}

看來在這個模式裏table是個很重要的角色啊,讓我們來看看他吧(這裏只給出個簡單的):

public class Table {  
        private final String[] buffer;  
        private int tail;  //下一個放put(數據)的地方    
        private int head;  //下一個取take(數據)的地方   
        private int count; // buffer內的數據數量   
        public Table(int count) {  
                this.buffer = new String[count];//總量是確定的   
                this.head = 0;  
                this.tail = 0;  
                this.count = 0;  
        }  
        // 放置數據   
        public synchronized void put(String cake) throws InterruptedException {  
                System.out.println(Thread.currentThread().getName() + " puts " + cake);  
                while (count >= buffer.length) {//數據放滿了就只能等待   
                        wait();  
                }  
                buffer[tail] = cake;  
                tail = (tail + 1) % buffer.length;  
                count++;  
                notifyAll();//有數據了,喚醒線程去取數據   
        }  

        // 取得數據   
        public synchronized String take() throws InterruptedException {  
                while (count <= 0) {//沒有數據就只能等待   
                        wait();  
                }  
                String cake = buffer[head];  
                head = (head + 1) % buffer.length;  
                count--;  
                notifyAll();//有位置可以放數據了,喚醒線程,不等了   
                System.out.println(Thread.currentThread().getName() + " takes " + cake);  
                return cake;  
        }  
}

好了我們來實驗吧:

public class Main {  
        public static void main(String[] args) {  
                Table table = new Table(3);     // 建立可以放置數據的橋梁參與者,3是他所能放置的最大數量的數據。
                new MakerThread("MakerThread-1", table, 31415).start();//生產數據   
                new MakerThread("MakerThread-2", table, 92653).start();  
                new MakerThread("MakerThread-3", table, 58979).start();  
                new EaterThread("EaterThread-1", table, 32384).start();//消費數據   
                new EaterThread("EaterThread-2", table, 62643).start();  
                new EaterThread("EaterThread-3", table, 38327).start();  
        }  
}  

需要各種it視頻關註獲取

技術分享圖片

生產者-消費者模式實現