Java实现生产者消费者案例
目錄
一、生產者消費者模式概述
二、生產者消費者案例
三、代碼
奶箱類(Box):
生產者類(Producer):
消費者類(Customer):
測試類(BoxDemo):
四、運行結果
一、生產者消費者模式概述
生產者消費者是一個十分經典的多線程協作的模式,弄懂生產者消費者問題能夠讓我們對多線程編程的理解更加深刻,所謂生產者消費問題,實際上主要是包含了兩類線程:
1、一類是生產者線程用于生產數據
2、一類是消費者線程用于消費數據
為了解生產者和消費者的關系,通常會采用共享的數據區域,就像是一個倉庫
1、生產者生產數據之后直接放置在共享區中,并不需要關心消費者的行為
2、消費者只需要從共享數據區中去獲取數據,并不需要關心生產者的行為
二、生產者消費者案例
生產者和消費者案例中包含的類:
??????? 1、奶箱類(Box):定義一個成員變量,表示第x奶,提供存儲牛奶的和獲取牛奶的操作
??????? 2、生產者類(Producer):實現Runnable接口,重寫run()方法,調用存儲牛奶的操作
??????? 3、消費者類(Customer):實現Runnable接口,重寫run()方法,調用獲取牛奶的操作
??????? 4、測試類(BoxDemo):里面有main方法,main方法中的代碼步驟如下
??????????? A:創建奶箱對象,這是共享數據區域
??????????? B:創建生產者對象,把奶箱對象作為構造方法參數傳遞,因為在這個類中要調用存儲牛奶的操作
??????????? C:創建消費者對象,把奶箱對象作為構造方法參數傳遞,因為在這個類中要調用獲取牛奶的操作
??????????? D:創建2個線程對象,分別把生產者對象和消費者對象作為構造方法參數傳遞
??????????? E:啟動線程
三、代碼
奶箱類(Box):
public class Box {//定義一個成員變量,表示第x瓶奶private int milk;//定義一個成員變量,表示奶箱的狀態private boolean state = false;//提供存儲牛奶的和獲取牛奶的操作public synchronized void put(int milk) {//如果有牛奶,等待消費if (state) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果沒喲牛奶,就生產牛奶this.milk = milk;System.out.println("送奶工將第" + this.milk + "瓶奶放入奶箱");//生產完畢之后,修改奶箱狀態state = true;//喚醒其他等待的想線程notifyAll();}public synchronized void get() {//如果沒有牛奶等待生產if (!state) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}//如果有牛奶,就消費牛奶System.out.println("用戶拿到第" + this.milk + "瓶奶");//生產完畢之后,修改奶箱狀態state = false;//喚醒其他等待的想線程notifyAll();}}生產者類(Producer):
public class Producer implements Runnable {private Box b;public Producer(Box b) {this.b = b;}@Overridepublic void run() {for (int i = 1; i <= 5; i++) {b.put(i);}} }消費者類(Customer):
public class Customer implements Runnable {private Box b;public Customer(Box b) {this.b = b;}@Overridepublic void run() {while (true) {b.get();}} }測試類(BoxDemo):
public class BoxDemo {public static void main(String[] args) {//創建奶箱對象,這是共享數據區域Box b = new Box();//創建生產者對象,把奶箱對象作為構造方法參數傳遞,因為在這個類中要調用存儲牛奶的操作Producer p = new Producer(b);//創建消費者對象,把奶箱對象作為構造方法參數傳遞,因為在這個類中要調用獲取牛奶的操作Customer c = new Customer(b);//創建2個線程對象,分別把生產者對象和消費者對象作為構造方法參數傳遞Thread t1 = new Thread(p);Thread t2 = new Thread(c);//啟動線程t1.start();t2.start();} }四、運行結果
總結
以上是生活随笔為你收集整理的Java实现生产者消费者案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ghost的使用方法
- 下一篇: HackRF实现GPS欺骗教程