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