设计模式2.工厂设计模式(生产者消费者问题)
Posted 菜鸟更要虚心学习
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式2.工厂设计模式(生产者消费者问题)相关的知识,希望对你有一定的参考价值。
生产者消费者模型 与 多线程
生产者、消费者在同一时间内共用同一存储空间,
生产者向共享空间生产数据,
而消费者取走共享的数据。、
经典问题描述:
生产者不断交替地生产两组数据“姓名--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.工厂设计模式(生产者消费者问题)的主要内容,如果未能解决你的问题,请参考以下文章