`
825197453
  • 浏览: 101767 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

生产者与消费者

阅读更多
public class MainThread
{
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Queue queue = new Queue(); //定义缓冲区;
        Producer producer = new Producer(queue); //生产者
        Consumer consumer = new Consumer(queue); //消费者
        new Thread(producer).start();
        new Thread(consumer).start();
    }
}

/*注意:wait notify notifyAll只能在同步方法或同步块中调用*/
class Queue   //queue表示队列
{
    int product = 0;
    
    boolean bfull = false;
    
    public synchronized void setProduct(int product)
    {
        if (bfull)//如果队列已满,则调用wait等待消费者取走产品
        {
            try
            {
                wait();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        /*开始放置产品到队列中*/
        this.product = product;
        System.out.println("Producer set product:" + product);
        bfull = true;
        notify();//生产产品后通知消费者取走产品
    }
    
    public synchronized void getProduct()
    {
        if (!bfull)//如果队列是空的,则调用wait等待生产者生产产品
        {
            try
            {
                wait();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        /*开始从队列取走产品*/
        System.out.println("Consumer get product:" + product);
        bfull = false;
        notify();//取走产品后通知生产者继续生产产品
    }
}

class Producer implements Runnable
{
    Queue queue;
    
    Producer(Queue queue)
    {
        this.queue = queue;
    }
    
    public void run()//生产线程
    {
        for (int i = 1; i <= 10; i++)
        {
            queue.setProduct(i);
        }
    }
}

class Consumer implements Runnable
{
    Queue queue;
    
    Consumer(Queue queue)
    {
        this.queue = queue;
    }
    
    public void run()//消费线程
    {
        for (int i = 1; i <= 10; i++)
        {
            queue.getProduct();
        }
    }
}





/* 
 * Java 生产者-消费者案例框架
 *“生产者-消费者”问题的含义是,
 *系统中有很多生产者和消费者并
 *发工作生产者负责生产资源,消费者消耗资源。
 *当消费者消费资源时,如果资源不足,则需要等待,
 *反之当生产者生产资源时,若资源已满,则也需要等待。
 *另外同一时刻只能有一个生产者或消费者进行操作。 
 */

//面包容器(资源)      
class BreadContainer
{
    // 容器的最大容量   
    public static final int maxNum = 300;
    
    // 当前面包的数量   
    private int num;
    
    // 无参构造器   
    public BreadContainer()
    {
    }
    
    // 有参构造器   
    public BreadContainer(int num)
    {
        // 初始化面包数量   
        this.num = num;
    }
    
    // 制作面包的同步方法   
    public synchronized void produceBread(int produceNum, String ProducerSName)
    {
        // 测试是否可以生产面包   
        while (num + produceNum > maxNum)
        {
            // 面包充足,生产者等待   
            System.out.println(ProducerSName + "要生产" + produceNum + "个,当前" + num
                    + "个,资源充足,不需要生产," + ProducerSName + "去等待!");
            try
            {
                wait();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        // 满足条件后,生产者生产面包,刷新数量   
        num = num + produceNum;
        System.out.println(ProducerSName + "生产了" + produceNum + "个,现在有" + num
                + "个。");
        // 唤醒资源等待池中的所有线程   
        notifyAll();
    }
    
    public synchronized void consumeBread(int consumeNum, String ConsumerSName)
    {
        // 测试面包数量是否够消费   
        while (consumeNum > num)
        {
            // 不够数量,消费者等待   
            System.out.println(ConsumerSName + "要消费" + consumeNum + "个,由于现在只有"
                    + num + "个," + ConsumerSName + "于是去等待!");
            try
            {
                wait();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        // 数量充足,消费面包,刷新数量   
        num = num - consumeNum;
        System.out.println(ConsumerSName + "消费了" + consumeNum + "个,现在还剩下" + num
                + "个");
        // 唤醒资源等待池中的所有线程   
        this.notifyAll();
    }
}

// 生产者类   
class ProducerS extends Thread
{
    // 记录该生产者一次生产的数量   
    private int produceNum;
    
    // 生产者需要访问的面包容器资源   
    private BreadContainer bc;
    
    // 无参构造器   
    public ProducerS()
    {
    }
    
    // 有参构造器   
    public ProducerS(int produceNum, BreadContainer bc, String ProducerSName)
    {
        // 对线程进行初始化   
        this.produceNum = produceNum;
        this.bc = bc;
        this.setName(ProducerSName);
    }
    
    // 生产者的工作方法   
    public void run()
    {
        // 调用资源容器的同步方法生产资源   
        bc.produceBread(produceNum, this.getName());
    }
}

// 消费者类   
class ConsumerS extends Thread
{
    // 记录该消费者一次消费的数量   
    private int consumeNum;
    
    // 消费者需要访问的面包容器资源   
    private BreadContainer bc;
    
    // 无参构造器   
    public ConsumerS()
    {
    }
    
    // 有参构造器   
    public ConsumerS(int consumeNum, BreadContainer bc, String ConsumerSName)
    {
        // 对线程进行初始化   
        this.consumeNum = consumeNum;
        this.bc = bc;
        this.setName(ConsumerSName);
    }
    
    // 消费者的行为方法   
    public void run()
    {
        // 调用资源容器的同步方法生产资源   
        bc.consumeBread(consumeNum, this.getName());
    }
}

public class Sample16_9
{
    public static void main(String args[])
    {
        // 创建资源对象,初始面包有50个   
        BreadContainer bc = new BreadContainer(50);
        // 创建对应的生产者和消费者   
        ProducerS p1 = new ProducerS(50, bc, "P1");
        ProducerS p2 = new ProducerS(200, bc, "P2");
        ProducerS p3 = new ProducerS(290, bc, "P3");
        ConsumerS c1 = new ConsumerS(70, bc, "c1");
        ConsumerS c2 = new ConsumerS(80, bc, "c2");
        // 启动生产者消费者线程   
        c1.start();
        c2.start();
        p1.start();
        p3.start();
        p2.start();
    }
}

 

分享到:
评论

相关推荐

    生产者与消费者实验报告

    生产者与消费者模型主要包括两部分:生产者(Producer)和消费者(Consumer)。其中,生产者负责创建数据并将其放入缓冲区,而消费者则从缓冲区中取出数据进行处理。为了确保数据的正确性以及系统的高效运行,必须在...

    生产者与消费者生产者与消费者

    ### 生产者与消费者模型详解 #### 一、引言 生产者-消费者问题作为操作系统中的经典进程同步问题,自1965年由Edsger Dijkstra首次提出以来,一直是计算机科学领域研究的重要内容之一。它不仅展示了信号量机制的...

    pv操作解决生产者与消费者问题

    此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...

    生产者与消费者实验代码

    ### 生产者与消费者实验代码知识点解析 #### 一、实验背景与目的 生产者-消费者问题是一个经典的多线程同步问题,在计算机科学领域中,主要用于研究如何在多个线程之间进行协调工作的问题。该实验旨在通过编程实现...

    生产者与消费者的实验

    **生产者消费者问题的核心概念:** 1. **共享缓冲区**:这是生产者和消费者共享的关键资源。它是一个有限大小的存储区域,用于暂时存放产品。在本实验中,缓冲区的大小是固定的,因此必须管理好何时添加和取出产品...

    操作系统中生产者与消费者问题实例

    操作系统中的生产者与消费者问题是多线程编程中的一个经典模型,它主要研究的是如何有效地在共享资源之间协调生产者和消费者的行为,以避免数据竞争和死锁等问题。在这个C#编写的实例中,我们将深入探讨这个问题及其...

    进程同步实验——生产者与消费者问题算法实现

    在这个实验“进程同步实验——生产者与消费者问题算法实现”中,我们探讨了一个经典的并发问题:生产者-消费者问题。 生产者-消费者问题是多线程编程中的一种典型应用场景,模拟了实际生产流水线的过程。在这个问题...

    java生产者与消费者实验报告

    ### Java生产者与消费者模型详解 ...实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个生产者与三个消费者之间的数据同步交互,验证了生产者-消费者模式的有效性和可行性。

    操作系统课程设计——模拟生产者与消费者(java)

    生产者与消费者进程共享一个大小固定的缓冲区。其中,一个或多个生产者生产数据,并将生产的数据存入缓冲区,并有一个或多个消费者从缓冲区中取数据。 2、 系统设计: 系统的设计必须要体现进程之间的同步关系,...

    操作系统生产者与消费者问题Java简单模拟实现

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

    操作系统课程设计生产者与消费者

    ### 操作系统课程设计:生产者与消费者问题详解 #### 一、问题背景与意义 在计算机科学领域,特别是操作系统理论中,“生产者-消费者”问题是一个非常经典的进程同步问题。这一问题最早由著名的计算机科学家Edsger...

    操作系统实验之进程的互斥与同步(生产者与消费者问题)VC++

    例如,在生产者与消费者问题中,有一个缓冲区作为共享资源,生产者将产品放入缓冲区,而消费者则从缓冲区取出产品。为了保证数据的一致性,必须确保在任何时候,缓冲区要么只允许一个生产者写入,要么只允许一个消费...

    操作系统实验生产者与消费者实验报告及代码

    根据给定的文件信息,以下是对“操作系统实验生产者与消费者实验报告及代码”的详细解析: ### 一、实验背景与目的 本次实验基于Windows操作系统环境,通过利用其提供的API函数来实现进程间的互斥与同步机制。实验...

    生产者与消费者问题(C++)

    在生产者与消费者问题中,可以使用两个信号量分别控制生产者和消费者对缓冲区的操作。 - **互斥锁**:另一种常见的同步机制,用于确保同一时间只有一个进程能够访问临界资源。在本例中,可以使用互斥锁来防止生产者...

    利用单线程完成的生产者与消费者程序

    然而,给定的标题“利用单线程完成的生产者与消费者程序”表明,这个程序是在单线程环境中实现的,这意味着没有并发线程,而是通过某种机制模拟了生产者和消费者的行为。 生产者-消费者模型通常用于处理数据流,...

    进程同步与互斥 生产者与消费者问题--操作系统大作业

    ### 进程同步与互斥:生产者与消费者问题 #### 一、基础知识与概念解析 **1.1 操作系统的基本概念** 操作系统(Operating System, OS)是计算机系统的核心软件,负责管理和协调计算机硬件资源及软件资源。它通过...

    Java生产者与消费者

    在Java编程中,"生产者与消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的核心思想是通过共享一个有限的缓冲区,使得生产者线程可以将产品放入缓冲区,而消费者线程则可以从缓冲区取出...

    生产者与消费者模式

    在生产者与消费者模式中,生产者模块负责创建数据,消费者模块则负责处理这些数据。两者之间通过一个缓冲区进行交互,这个缓冲区可以是队列、环形缓冲区或双缓冲区等形式。例如,在一个简单的寄信场景中,写信的人...

    操作系统生产者与消费者课程设计报告

    操作系统生产者与消费者课程设计报告

Global site tag (gtag.js) - Google Analytics