`

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

 
阅读更多
  1. /*@author shijin  
  2. * 生产者与消费者模型中,要保证以下几点:  
  3. * 1 同一时间内只能有一个生产者生产     生产方法加锁sychronized  
  4. * 2 同一时间内只能有一个消费者消费     消费方法加锁sychronized  
  5. * 3 生产者生产的同时消费者不能消费     生产方法加锁sychronized  
  6. * 4 消费者消费的同时生产者不能生产     消费方法加锁sychronized  
  7. * 5 共享空间空时消费者不能继续消费     消费前循环判断是否为空,空的话将该线程wait,释放锁允许其他同步方法执行  
  8. * 6 共享空间满时生产者不能继续生产     生产前循环判断是否为满,满的话将该线程wait,释放锁允许其他同步方法执行     
  9. */ 
  10.  
  11. //主类  
  12. class  ProducerConsumer  
  13. {  
  14.     public static void main(String[] args)   
  15.     {  
  16.         StackBasket s = new StackBasket();  
  17.         Producer p = new Producer(s);  
  18.         Consumer c = new Consumer(s);  
  19.         Thread tp = new Thread(p);  
  20.         Thread tc = new Thread(c);  
  21.         tp.start();  
  22.         tc.start();  
  23.     }  
  24. }  
  25.  
  26. //  
  27. class Mantou  
  28. {  
  29.     private int id;  
  30.       
  31.     Mantou(int id){  
  32.         this.id = id;  
  33.     }  
  34.  
  35.     public String toString(){  
  36.         return "Mantou :" + id;  
  37.     }  
  38. }  
  39.  
  40. //共享栈空间  
  41. class StackBasket  
  42. {  
  43.     Mantou sm[] = new Mantou[6];  
  44.     int index = 0;  
  45.       
  46.     /**   
  47.     * show 生产方法.  
  48.     * show 该方法为同步方法,持有方法锁;  
  49.     * show 首先循环判断满否,满的话使该线程等待,释放同步方法锁,允许消费;  
  50.     * show 当不满时首先唤醒正在等待的消费方法,但是也只能让其进入就绪状态,  
  51.     * show 等生产结束释放同步方法锁后消费才能持有该锁进行消费  
  52.     * @param m 元素  
  53.     * @return 没有返回值   
  54.     */   
  55.  
  56.     public synchronized void push(Mantou m){  
  57.         try{  
  58.             while(index == sm.length){  
  59.                 System.out.println("!!!!!!!!!生产满了!!!!!!!!!");  
  60.                 this.wait();  
  61.             }  
  62.             this.notify();  
  63.         }catch(InterruptedException e){  
  64.             e.printStackTrace();  
  65.         }catch(IllegalMonitorStateException e){  
  66.             e.printStackTrace();  
  67.         }  
  68.           
  69.         sm[index] = m;  
  70.         index++;  
  71.         System.out.println("生产了:" + m + " 共" + index + "个馒头");  
  72.     }  
  73.  
  74.     /**   
  75.     * show 消费方法  
  76.     * show 该方法为同步方法,持有方法锁  
  77.     * show 首先循环判断空否,空的话使该线程等待,释放同步方法锁,允许生产;  
  78.     * show 当不空时首先唤醒正在等待的生产方法,但是也只能让其进入就绪状态  
  79.     * show 等消费结束释放同步方法锁后生产才能持有该锁进行生产  
  80.     * @param b true 表示显示,false 表示隐藏   
  81.     * @return 没有返回值   
  82.     */   
  83.     public synchronized Mantou pop(){  
  84.         try{  
  85.             while(index == 0){  
  86.                 System.out.println("!!!!!!!!!消费光了!!!!!!!!!");  
  87.                 this.wait();  
  88.             }  
  89.             this.notify();  
  90.         }catch(InterruptedException e){  
  91.             e.printStackTrace();  
  92.         }catch(IllegalMonitorStateException e){  
  93.             e.printStackTrace();  
  94.         }  
  95.         index--;  
  96.         System.out.println("消费了:---------" + sm[index] + " 共" + index + "个馒头");  
  97.         return sm[index];  
  98.     }  
  99. }  
  100.  
  101. class Producer implements Runnable  
  102. {  
  103.     StackBasket ss = new StackBasket();  
  104.     Producer(StackBasket ss){  
  105.         this.ss = ss;  
  106.     }  
  107.  
  108.     /**   
  109.     * show 生产进程.   
  110.     */   
  111.     public void run(){  
  112.         for(int i = 0;i < 20;i++){  
  113.             Mantou m = new Mantou(i);  
  114.             ss.push(m);  
  115. //          System.out.println("生产了:" + m + " 共" + ss.index + "个馒头");  
  116. //          在上面一行进行测试是不妥的,对index的访问应该在原子操作里,因为可能在push之后此输出之前又消费了,会产生输出混乱  
  117.             try{  
  118.                 Thread.sleep((int)(Math.random()*500));  
  119.             }catch(InterruptedException e){  
  120.                 e.printStackTrace();  
  121.             }  
  122.         }  
  123.     }  
  124. }  
  125.  
  126. class Consumer implements Runnable  
  127. {  
  128.     StackBasket ss = new StackBasket();  
  129.     Consumer(StackBasket ss){  
  130.         this.ss = ss;  
  131.     }  
  132.  
  133.     /**   
  134.     * show 消费进程.  
  135.     */   
  136.     public void run(){  
  137.         for(int i = 0;i < 20;i++){  
  138.             Mantou m = ss.pop();  
  139. //          System.out.println("消费了:---------" + m + " 共" + ss.index + "个馒头");  
  140. //  同上  在上面一行进行测试也是不妥的,对index的访问应该在原子操作里,因为可能在pop之后此输出之前又生产了,会产生输出混乱  
  141.             try{  
  142.                 Thread.sleep((int)(Math.random()*1000));  
  143.             }catch(InterruptedException e){  
  144.                 e.printStackTrace();  
  145.             }  
  146.         }  
  147.     }  
分享到:
评论

相关推荐

    java多线程之消费者生产者模式参照.pdf

    消费者生产者模式是Java多线程编程中的重要概念,它展示了如何通过同步机制来协调线程间的操作,实现高效且安全的资源共享。这个模式在实际应用中非常常见,例如在缓存管理、数据库连接池、队列操作等场景都有所应用...

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

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

    java多线程之消费者生产者模式.pdf

    Java中的消费者-生产者模式是一种典型的多线程协作问题,用于解决在并发环境下资源的共享和同步问题。在这个模式中,生产者负责生成资源(例如,馒头),而消费者则负责消耗这些资源。为了保证线程安全和避免数据...

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

    生产者-消费者模式是一种经典的多线程设计模式,用于解决数据共享问题,尤其是在一个线程生产数据而另一个线程消费数据的情况下。在这个模式中,生产者负责生成数据并放入共享的数据结构(如队列),而消费者则从这...

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

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

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

    总结来说,“java多线程(生产者与消费者)”是关于如何在Java中使用同步、线程间通信和共享资源来实现高效且安全的并发编程。通过理解并熟练应用这些概念和工具,开发者可以构建出能够充分利用多核处理器能力的高...

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

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

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

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

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

    生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...

    java多线程_消费者与生产者模型

    在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...

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

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

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

    Java多线程生产者消费者模式是指在Java编程中,使用多线程来实现生产者和消费者之间的数据交换 и处理的模式。该模式下,生产者负责产生数据,而消费者负责处理数据。这种模式可以提高系统的性能和效率,特别是在高...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    1. 生产者消费者模式:通过阻塞队列实现生产者线程和消费者线程之间的数据交换,确保生产速度与消费速度的平衡,避免资源浪费。Java中的BlockingQueue接口和相关实现类如ArrayBlockingQueue、LinkedBlockingQueue等...

    Java 生产者消费者模式

    在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...

    java线程安全以及生产者消费者demo

    Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...

    java多线程例子-生产者消费者

    在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...

    java 多线程之生产者与消费者

    Java多线程中的“生产者与消费者”模式是一种经典的并发编程模型,用于解决资源的生产与消费问题。在这个模式中,生产者线程负责创建或生成数据,而消费者线程则负责处理或消耗这些数据。这种模式充分利用了系统资源...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...

    JAVA多线程实现生产者消费者的实例详解

    JAVA多线程实现生产者消费者的实例详解 JAVA多线程实现生产者消费者是指在JAVA编程语言中使用多线程技术来实现生产者消费者模型的实例详解。生产者消费者模型是指在计算机科学中的一种经典模式,描述了生产者和消费...

Global site tag (gtag.js) - Google Analytics