关于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回到消费者这里,循环往复,模式就出来了,完美!

				
时间: 2024-10-12 23:46:14

关于java中生产者消费者模式的理解的相关文章

java多线程 生产者消费者模式

package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static void main(String[] args) { Godown godown = new Godown(50); for (int i = 0; i < 5; i++) { new ProducerThread(i * 10, godown).start(); new ConsumerThre

java 多线程-生产者消费者模式-管程法

生产者消费者模式管程法通过容器中介,将数据放入和取出 wait()导致当前线程等待,直到另一个线程调用该对象的notify()或notyfyAll()方法notify()唤醒正在等待对象监视器的单个线程,notifyAll()唤醒正在等待对象监视器的所有线程 public class tuble { public static void main(String[]args) { SynContainer container=new SynContainer(); new Productor(co

Java多线程-生产者/消费者模式实现

单生产者与单消费者 示例: public class ProduceConsume { public static void main(String[] args) { String lock = new String(""); Produce produce = new Produce(lock); Consume consume = new Consume(lock); new Thread(() -> { while (true) { produce.setValue();

java——利用生产者消费者模式思想实现简易版handler机制

参考教程:http://www.sohu.com/a/237792762_659256 首先介绍每一个类: 1.Message: 这个类的作用是存储一个生产者生产出来的具体的消息,就类似链表队列中的一个节点,自行定义需要存储的内容. code:消息要执行的具体动作代码 msg:消息内容 target:用来关联hadler,根本目的时为了使这几个类共享一个MessageQueue,这个很重要 2.MessageQueue: 这个类就是生产者和消费者线程需要共享的一个存储消息的队列,生产者将消息放入

JAVA线程-生产者消费者模式

package cn.tt; public class ProducerConsumer { public static void main(String[] args) throws InterruptedException { SyncStack ss = new SyncStack(); Producer p = new Producer(ss); consumer c = new consumer(ss); new Thread(p).start(); Thread.sleep(2000

java中的工厂模式

java中的工厂模式,个人理解是:要想制作一个汽车,则必须有轮子,发动机,座椅等. 1.创建一个接口,并且使得轮子,发动机,座椅三个实现类实现这个接口. 2.创建一个工厂,生成基于给定信息的实体类的对象. 1 public class 零件工厂{ 2 3 4 public Shape 获得零件(String 零件名称){ 5 if(零件名称== null){ 6 return null; 7 } 8 if(零件名称.equalsIgnoreCase("轮子")){ 9 return n

java中多线程通信实例:生产者消费者模式

线程间的通信: 其实就是多个线程再操作同一个资源,但是操作的动作不同   当某个线程进入synchronized块后,共享数据的状态不一定满足该线程的需要,需要其他线程改变共享数据的状态后才能运行,而由于当时线程对共享资源时独占的,它必须解除对共享资源的锁定的状态,通知其他线程可以使用该共享资源. Java中的 wait(),notify(),notifyAll()可以实现线程间的通信. 生产者--消费者问题是典型的线程同步和通信问题 /** * 生产者和消费者问题,生产者生成出产品,消费者去购

java 多线程并发系列之 生产者消费者模式的两种实现

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这种生产消费能力不均衡的问题,所以便有了生产者和消费者模式. 什么是生

生产者/消费者模式之深入理解

#include <windows.h> #include <iostream> const unsigned short SIZE_OF_BUFFER = 2; //缓冲区长度 unsigned short ProductID = 0; //产品号 unsigned short ConsumeID = 0; //将被消耗的产品号 unsigned short in = 0; //产品进缓冲区时的缓冲区下标 unsigned short out = 0; //产品出缓冲区时的缓冲区