首页 > 代码库 > 关于java中生产者消费者模式的理解
关于java中生产者消费者模式的理解
在说生产者消费者模式之前,我觉得有必要理解一下 Obj.wait(),与Obj.notify()方法。wait()方法是指在持有对象锁的线程调用此方法时,会释放对象锁,同时休眠本线程。notify()方法是持有相同的对象锁来唤醒休眠的线程,使其具有抢占cpu的资格。可以理解同步方法,同步方法的对象锁就是谁调用这个方法,这个对象就是对象锁。
根据李兴华老师的视频讲解,建立一个生产者类,一个消费者类,还有一个Info类,贴上代码:
1.生产者类
package com.company;/** * Created by Administrator on 2016/8/30. */public class Productor implements Runnable { private Info info; public Productor(Info info) { this.info = info; } @Override public void run() { for (int i=0;i<50;i++) { if (i%2==0) {// info.setTitle("陶帅");// info.setContent("一个帅哥");// try {// Thread.sleep(100);// } catch (InterruptedException e) {// e.printStackTrace();// } info.set("陶帅","一个帅哥"); }else {// info.setTitle("可爱的动物");// info.setContent("草泥马"); info.set("可爱的动物","草泥马");// try {// Thread.sleep(100);// } catch (InterruptedException e) {// e.printStackTrace();// } } } }}
2.消费者类
package com.company;/** * Created by Administrator on 2016/8/30. */public class Consumer implements Runnable { private Info info; public Consumer(Info info) { this.info = info; } @Override public void run() { for (int i=0;i<50;i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } info.get(); } }}
3.Info类(重点)
package com.company;/** * Created by Administrator on 2016/8/30. */public class Info { private String Title; private String content; private boolean flag=true;//true表示可以生产不能取走消费,false相反 public synchronized void set(String Titile,String content){ if (!flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.Title=Titile; this.content=content; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } flag=false; notify(); } public synchronized void get(){ if (flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(this.Title+"------->"+this.content); flag=true; notify(); }// public String getTitle() {// return Title;// }//// public void setTitle(String title) {// Title = title;// }//// public String getContent() {// return content;// }//// public void setContent(String content) {// this.content = content;// }}
4.测试类
package com.company;public class Main { public static void main(String[] args) { Info info=new Info(); Productor p=new Productor(info); Consumer c=new Consumer(info); new Thread(p).start(); new Thread(c).start(); }}
总结分析:生产者和消费者两个线程同时抢占CPU,假如消费者先抢到,此时调用get()方法即消费取走,但是此时flag为true,因此会进入wait()方法,所以此时只能是生产者抢占到CPU,根据生产者调用set()方法,生产后执行
flag=false; notify();
此时生产者和消费者所在的两个线程又站在同一起跑线上了,继续CPU争夺战。如果不幸的消费者又没有抢过生产者,生产者继续执行set();此时flag已经是false了,根据代码
if (!flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } }
所以生产者只能乖乖的wait();CPU回到消费者这里,循环往复,模式就出来了,完美!
关于java中生产者消费者模式的理解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。