日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java实现生产者消费者案例

發(fā)布時(shí)間:2024/3/12 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现生产者消费者案例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、生產(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。