`
dongjun316
  • 浏览: 32722 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java多线程 生产者 消费者(转)

    博客分类:
  • Java
阅读更多
忘记哪转的了,对不起作者了。

/* 
 * 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();
    }
}

分享到:
评论

相关推荐

    java多线程实现生产者和消费者

    在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    java多线程经典模型生产者消费者

    java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...

    java多线程(生产者与消费者)

    生产者消费者模式是一种设计模式,它描述了两个不同类型的线程如何协作完成工作:生产者负责生成数据,而消费者负责消耗这些数据。为了使这个模式在多线程环境下安全运行,我们需要使用Java中的同步机制。 1. **...

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

    总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...

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

    Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...

    java 多线程生产者消费者模型demo

    Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...

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

    java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...

    java多线程实现生产者消费者问题

    用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题

    java多线程实现生产者消费者关系

    在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...

    java多线程生产者消费者问题示例

    java多线程学习,生产者消费者问题示例

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    java实现多线程经典模型生产者消费

    java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...

    JAVA实现线程间同步与互斥生产者消费者问题

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    操作系统:多线程处理生产者消费者,java实现

    基本满足操作系统课上要求,java实现的生产者消费者模型。

    java多线程生产者与消费者案例

    关于java多线程的东西,里面有生产者与消费者的案例,感兴趣的朋友看一下吧。

    Java多线程生产者消费者例程

    Java多线程生产者消费者基础示例,IT大厂如华为等基础面试中经常出现的Java基础笔试题目,使用最基本的线程同步、Notify及wait等实现最基本的生产者消费者例程,适用于Java编程初学者了解多线程、同步块、线程安全、...

    由生产者/消费者问题看JAVA多线程

    ### 由生产者/消费者问题深入理解JAVA多线程 #### 生产者/消费者问题概述 生产者/消费者问题是一个经典的计算机科学问题,用于展示进程间的通信与同步问题。在这个模型中,生产者负责创建数据并将其放置到共享内存...

    Java多线程生产者消费者模式实现过程解析

    Java多线程生产者消费者模式实现过程解析 Java多线程生产者消费者模式是指在Java编程中,使用多线程来实现生产者和消费者之间的数据交换 и处理的模式。该模式下,生产者负责产生数据,而消费者负责处理数据。这种...

Global site tag (gtag.js) - Google Analytics