码迷,mamicode.com
首页 > 其他好文 > 详细

【设计模式】2.工厂设计模式(生产者消费者问题)

时间:2017-09-04 16:57:29      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:inf   定义   style   []   情况   ted   zed   ack   切换   

生产者消费者模型 与 多线程

生产者、消费者在同一时间内共用同一存储空间

生产者向共享空间生产数据,

而消费者取走共享的数据。、

经典问题描述:

生产者不断交替地生产两组数据“姓名--1 --> 内容--1”,“姓名--2--> 内容--2”,消费者不断交替地取得这两组数据。

 

多线程的情况下会出现以下不确定性的问题:

  • 生产者只生产了姓名还没有生产内容信息, 程序就切换到消费者线程,结果是把姓名和上一次的内容联系起来。
  • 生产者生产了若干次数据,消费者才开始取数据,或者消费者取完一次数据后,还没等生产者放入新的数据,又重复取出已取过的数据。

问题1 同步可以解决

问题2 线程通信可以解决

总结:生产者线程放入数据后,通知消费者线程取出数据,消费者线程取出数据后,通知生产者线程生产数据,这里用 wait/notify 机制来实现。

 

【实例代码】

 1 class Info {//定义信息类
 2     private String name = "name";
 3     private String content = "content";
 4     private boolean flag = true;// 设置标志位,初始时先生产
 5     public synchronized void set(String name, String content) {
 6         while (!flag) {//wait状态,等待其他线程,flag开始设置为TRUE,所以开始不执行
 7             try {
 8                 super.wait();
 9             } catch (InterruptedException e) {
10                 e.printStackTrace();
11             }
12         }
13             this.setName(name);
14             try {
15                 Thread.sleep(300);
16             } catch (InterruptedException e) {
17                 e.printStackTrace();
18             }
19             this.setContent(content);
20             flag = false;// 改变标志位,表示可以取走
21             super.notify();
22     }
23     public synchronized void get() {
24         while (flag) {
25             try {
26                 super.wait();
27             } catch (InterruptedException e) {
28                 e.printStackTrace();
29             }
30         }
31         try {
32             Thread.sleep(300);
33         } catch (InterruptedException e) {
34             e.printStackTrace();
35         }
36         System.out.println(this.getName() + 
37             "-->" + this.getContent());
38         flag = true;
39         super.notify();
40     }
41     public void setName(String name) {
42         this.name = name;
43     }
44     public void setContent(String content) {
45         this.content = content;
46     }
47     public String getName() {
48         return this.name;
49     }
50     public String getContent() {
51         return this.content;
52     }
53 }
54 class Producer implements Runnable {
55     private Info info = null;
56     public Producer(Info info) {
57         this.info = info;
58     }
59     public void run() {
60         boolean flag = true;
61         for (int i = 0; i < 10; i++) {
62             if (flag) {
63                 this.info.set("姓名--1", "内容--1");
64                 flag = false;
65             }else {
66                 this.info.set("姓名--2", "内容--2");;
67                 flag = true;
68             }
69         }
70     }
71 }
72 class Consumer implements Runnable{
73     private Info info = null ;
74     public Consumer(Info info){
75         this.info = info ;
76     }
77     public void run(){
78         for(int i=0;i<10;i++){
79             this.info.get() ;
80         }
81     }
82 }
83 public class Main {
84     public static void main(String[] args) {
85         Info info = new Info();
86         Producer pro = new Producer(info);
87         Consumer con = new Consumer(info) ; // 消费者
88         new Thread(pro).start() ;
89         //启动了生产者线程后,再启动消费者线程
90         try{
91             Thread.sleep(500) ;
92         }catch(InterruptedException e){
93             e.printStackTrace() ;
94         }
95         new Thread(con).start() ;
96     }
97 }

技术分享

 

【设计模式】2.工厂设计模式(生产者消费者问题)

标签:inf   定义   style   []   情况   ted   zed   ack   切换   

原文地址:http://www.cnblogs.com/StoneLuo/p/7474310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!