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

【转】经典生产者消费者问题实现 多线程实现

 
阅读更多

  1. package demo.thread;  
  2.   
  3. /** 
  4.  *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。 
  5.  *其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品  
  6.  */  
  7.   
  8. public class ProducersAndConsumers {  
  9.     public static void main(String[] args) {  
  10.         Storage storage = new Storage();  
  11.         Thread consumer = new Thread(new Consumer(storage));  
  12.         consumer.setName("消费者");  
  13.         Thread producer = new Thread(new Producer(storage));  
  14.         producer.setName("生产者");  
  15.         consumer.start();  
  16.         producer.start();  
  17.     }  
  18. }  
  19.   
  20. /** 
  21.  * 消费者 
  22.  */  
  23. class Consumer implements Runnable {  
  24.     private Storage storage;  
  25.   
  26.     public Consumer(Storage storage) {  
  27.         this.storage = storage;  
  28.     }  
  29.   
  30.     @Override  
  31.     public void run() {  
  32.         storage.pop();  
  33.     }  
  34. }  
  35.   
  36. /** 
  37.  * 生产者 
  38.  */  
  39. class Producer implements Runnable {  
  40.     private Storage storage;  
  41.   
  42.     public Producer(Storage storage) {  
  43.         this.storage = storage;  
  44.     }  
  45.   
  46.     @Override  
  47.     public void run() {  
  48.         Product product = new Product("090505105""电话");  
  49.         storage.push(product);  
  50.     }  
  51.   
  52. }  
  53.   
  54. /** 
  55.  * 产品类 
  56.  */  
  57. class Product {  
  58.     private String id;// 产品id   
  59.     private String name;// 产品名称   
  60.   
  61.     public Product(String id, String name) {  
  62.         this.id = id;  
  63.         this.name = name;  
  64.     }  
  65.   
  66.     @Override  
  67.     public String toString() {  
  68.         return "(产品ID:" + id + " 产品名称:" + name + ")";  
  69.     }  
  70.   
  71.     public String getId() {  
  72.         return id;  
  73.     }  
  74.   
  75.     public void setId(String id) {  
  76.         this.id = id;  
  77.     }  
  78.   
  79.     public String getName() {  
  80.         return name;  
  81.     }  
  82.   
  83.     public void setName(String name) {  
  84.         this.name = name;  
  85.     }  
  86.   
  87. }  
  88.   
  89. /** 
  90.  *仓库 
  91.  */  
  92. class Storage {  
  93.     // 仓库容量为10   
  94.     private Product[] products = new Product[10];  
  95.     private int top = 0;  
  96.   
  97.     // 生产者往仓库中放入产品   
  98.     public synchronized void push(Product product) {  
  99.         while (top == products.length) {  
  100.             try {  
  101.                 wait();//仓库已满,等待   
  102.             } catch (InterruptedException e) {  
  103.                 // TODO Auto-generated catch block   
  104.                 e.printStackTrace();  
  105.             }  
  106.         }  
  107.         //把产品放入仓库   
  108.         products[top++] = product;  
  109.         System.out.println(Thread.currentThread().getName() + " 生产了产品"  
  110.                 + product);  
  111.         notifyAll();//唤醒等待线程   
  112.   
  113.     }  
  114.   
  115.     // 消费者从仓库中取出产品   
  116.     public synchronized Product pop() {  
  117.         while (top == 0) {  
  118.             try {  
  119.                 wait();//仓库空,等待   
  120.             } catch (InterruptedException e) {  
  121.                 // TODO Auto-generated catch block   
  122.                 e.printStackTrace();  
  123.             }  
  124.   
  125.         }  
  126.   
  127.         //从仓库中取产品   
  128.         --top;  
  129.         Product p = new Product(products[top].getId(), products[top].getName());  
  130.         products[top] = null;  
  131.         System.out.println(Thread.currentThread().getName() + " 消费了产品" + p);  
  132.         notifyAll();//唤醒等待线程   
  133.         return p;  
  134.     }  
  135. }  

运行结果:

生产者 生产了产品(产品ID:090505105 产品名称:电话)
消费者 消费了产品(产品ID:090505105 产品名称:电话)

分享到:
评论

相关推荐

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

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

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

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

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

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

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

    12.2 Qt5多线程:使用信号量实现生产者和消费者

    生产者-消费者问题是并发编程中的一个经典模型,它描述了两个或多个线程之间的协作,其中一个或多个线程(生产者)负责生成数据,而其他线程(消费者)则负责处理这些数据。在实际应用中,这可以对应于例如数据生成...

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

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

    使用多线程程序模拟实现单生产者/多消费者问题(Linux下C语言)。

    使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...

    Linux c语言多线程实现生产者/消费者问题

    以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...

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

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

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

    生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则负责消费这些数据。关键在于,生产者不应在没有消费者准备接收的情况下生成数据,同时消费...

    生产者-消费者的Linux多线程实现.pdf

    本文将详细地阐述 Linux 下利用互斥锁、条件变量、线程管理等相关函数实现多线程生产者-消费者问题,以提高资源利用率。 线程基本概念 线程是进程的一条执行路径,它包含独立的堆栈和 CPU 寄存器状态,每个线程...

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

    生产者消费者问题是多线程编程中的一个经典模型,用于演示如何在并发环境中通过共享资源进行协作。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。问题的关键在于如何保证生产者不会在无处...

    生产者消费者问题(操作系统多线程经典问题)

    缓冲区没满:生产者可以生产 缓冲区没空:消费者可以消费 生产消费可以同时进行 生产者、消费者、产品、缓冲区的数量可以自定义

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

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

    多线程实现生产者消费者

    8. **死锁和饥饿**:在实现多线程生产者消费者模型时,必须警惕可能出现的死锁和饥饿问题。死锁是两个或更多线程相互等待对方释放资源导致的僵局,而饥饿则是指某一线程因为资源分配不公平而无法获得执行的机会。...

    Linux 多线程实现生产者消费者模式.pdf

    Linux多线程实现生产者消费者模式涉及到操作系统中的多个重要知识点,包括多线程编程、生产者消费者模型、互斥量、条件变量等。在Linux环境下,这些功能可以通过POSIX线程(pthread)库来实现。下面详细解释这些知识...

    生产者消费者的c++代码实现

    "生产者消费者问题C++代码实现" 生产者消费者问题是一个经典的进程同步问题,该问题最早由 Dijkstra...本代码实现了生产者消费者问题的同步,使用信号量机制来控制线程之间的访问顺序,防止多个线程同时访问共享资源。

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

    用到互斥锁和多线程,实现简单,易于理解。。。

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

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { this....

    生产者-消费者多线程处理

    在本场景中,我们关注的是一个经典的多线程问题——"生产者-消费者"模式。这个模式是解决资源管理与同步问题的一个有效策略,它在操作系统、并发编程和分布式系统等领域广泛应用。 生产者-消费者模型涉及到两个主要...

Global site tag (gtag.js) - Google Analytics