java并发编程(13):生产者—消费者模型(含代码)-编程开发技术

java并发编程(13):生产者—消费者模型(含代码)-编程开发技术

ID:30776614

大小:166.50 KB

页数:6页

时间:2019-01-03

java并发编程(13):生产者—消费者模型(含代码)-编程开发技术_第1页
java并发编程(13):生产者—消费者模型(含代码)-编程开发技术_第2页
java并发编程(13):生产者—消费者模型(含代码)-编程开发技术_第3页
java并发编程(13):生产者—消费者模型(含代码)-编程开发技术_第4页
java并发编程(13):生产者—消费者模型(含代码)-编程开发技术_第5页
资源描述:

《java并发编程(13):生产者—消费者模型(含代码)-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java并发编程(13):生产者一消费者模型(含代码)-编程开发技术Java并发编程(13):生产者一消费者模型(含代码)原文出处:兰亭风雨生产者消费者问题是线程模型屮的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。这里实现如下情况的生产-消费模型:生产者不断交替地生产两组数据“姓名-1->内容-1”,“姓名-2->内容-2”,消费者不断交替地取得这两组数据,这里的“姓名-1”和“姓名-2”模拟为数据的名称,“内容-1”和“内容-2”模拟为数据的内容。由于本程序中牵

2、扯到线程运行的不确定性,因此可能会出现以下问题:1、假设生产者线程刚向数据存储空间添加了数据的名称,还没有加入该信息的内容,程序就切换到了消费者线程,消费者线程将把信息的名称和上一个信息的内容联系在一起;2、生产者生产了若干次数据,消费者才开始取数据,或者是,消费者取完一次数据后,还没等生产者放入新的数据,乂重复取出了已取过的数据。问题1很明显要靠同步来解决,问题2则需要线程间通信,生产者线程放入数据后,通知消费者线程取岀数据,消费者线程取出数据后,通知生产者线程生产数据,这里用wait/notify机制來实现。详细

3、的实现代码如下:classInfo{//定义信息类privateStringname="name";//定义name属性,为了与下面set的name属性区别开privatcStringcontent="contcnt〃;//定义contcnt属性,为了与下而set的content屈性区别开privatebooleanflag=true;//设置标志位,初始时先生产publicsynchronizedvoidset(Stringname,Stringcontent){wh订e(!flag){try{super,wait

4、();}catch(IntenruptedExceptione){e.printStackTrace();this.setName(name);//设置名称try{Thread,sleep(300);}catch(JLnterruptedExceptione){e.printstackTrace();}this.setContent(content);//设置内容flag二false;//改变标志位,表示口J以取走super・notify();}publicsynchronizedvoidget(){while(fl

5、ag){try{super・wait();}catch(InterruptedExceptione){e.printStackTrace();}}try{Thread,sleep(300);}catch(InterruptedExceptione){e.printStackTrace();}System・out・println(this・getNameO+"-->"+this・getContent());flag=true;//改变标志位,表示可以生产super,notify();}publicvoidsetName

6、(Stringname){this・name=name;}publicvoidsetContent(Stringcontent){this.content二content;}publicStringgetName(){returnthis.name;}publicStringgetContent(){returnthis・content;}}classProducerimplementsRunnable{//通过Runnable实现多线程privateInfoinfo=null;//保存Info引用publicPro

7、ducer(Infoinfo){this,info二info;}publicvoidrun(){booleanflag=true;//定义标记位for(inti二0;i〈10;i++){if(flag){this.info,set(”姓名--1〃,"内容--1");//设置名称flag二false;}else{this.info,set(z,姓名--2〃,〃内容--2〃);//设置名称flag二true;}}}}classConsumerimplementsRunnable{privatcInfoinfo二null;

8、publicConsumer(Infoinfo){this.info=info;}publicvoidrun(){for(inti=0;i<10;i++){this・info,get();}}}publicclassThrcadCascDemo03{publicstaticvoidmain(Stringargs[]){Infoinfo=newI

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。