`

java线程:三种方式实现生产者消费者问题_1

 
阅读更多


java线程:三种方式实现生产者消费者问题_1

分类: java_线程 45人阅读 评论(0) 收藏 举报


本人采用java语言,用三种方式实现生产者——消费者的经典问题,至于生产者和消费的问题就不多说了,以下是第一种方式的具体代码:

[java] view plaincopy
  1. <span style="font-family:Arial;">  
  2. /** 
  3.  * 消费者:生产者:生产者和消费者共用一个仓库 
  4.  */  
  5. public class Consumer implements Runnable {  
  6.   
  7.     private Storage storage;  
  8.   
  9.     public Consumer(Storage storage) {  
  10.         this.storage = storage;  
  11.     }  
  12.       
  13.     // 消费  
  14.     public void cunsume() {  
  15.         while (true) {  
  16.             storage.get();  
  17.               
  18.             try {  
  19.                 Thread.sleep(1500); // 每消费完一件产品,休息1.5秒  
  20.             } catch (InterruptedException e) {  
  21.                 throw new RuntimeException(e);  
  22.             }  
  23.         }  
  24.     }  
  25.       
  26.     @Override  
  27.     public void run() {  
  28.         this.cunsume();  
  29.     }  
  30. }  
  31. </span>  



[java] view plaincopy
  1. <span style="font-family:Arial;">  
  2. /** 
  3.  * 生产者:生产者和消费者共用一个仓库 
  4.  */  
  5. public class Producer implements Runnable {  
  6.       
  7.     private Storage storage;  
  8.       
  9.     public Producer(Storage storage){  
  10.         this.storage = storage;  
  11.     }  
  12.       
  13.     @Override  
  14.     public void run(){  
  15.         this.produce();  
  16.     }  
  17.       
  18.     // 生产  
  19.     public void produce(){  
  20.         while(true){  
  21.             storage.put();  
  22.               
  23.             try {  
  24.                 Thread.sleep(1000); // 每生产完一件产品,休息1秒  
  25.             } catch (InterruptedException e) {  
  26.                 throw new RuntimeException(e);  
  27.             }  
  28.         }  
  29.     }  
  30. }  
  31. </span>  

[java] view plaincopy
  1. <span style="font-family:Arial;">  
  2. /** 
  3.  * 仓库: 
  4.  * 先生产的先消费:使用队列的方式实现 
  5.  */  
  6. public class Storage {  
  7.       
  8.     public static final int MAX_SIZE = 100// 仓库的最大货存  
  9.       
  10.     // 容器,为了使用方便,没有面向接口编程,使用LinkedList作为实现类  
  11.     private LinkedList<Object> container = new LinkedList<Object>();   
  12.       
  13.     // 从仓库中存放一个产品:  
  14.     public synchronized void put(){  
  15.         try {  
  16.             while (container.size() == MAX_SIZE) {  
  17.                 try {  
  18.                     this.wait();  
  19.                 } catch (InterruptedException e) {  
  20.                     throw new RuntimeException(e);  
  21.                 }  
  22.             }  
  23.               
  24.             System.out.println("put()等待结束,仓库现有数量为"+ container.size() +", 开始生产");  
  25.             container.addLast(new Object());   
  26.               
  27.         } finally {  
  28.             this.notifyAll(); // 通知其他线程  
  29.         }  
  30.     }  
  31.       
  32.     // 从仓库中取出一个产品:  
  33.     public synchronized Object get(){  
  34.         try {  
  35.             while (container.size() == 0) {  
  36.                 try {  
  37.                     this.wait();  
  38.                 } catch (InterruptedException e) {  
  39.                     throw new RuntimeException(e);  
  40.                 }  
  41.             }  
  42.               
  43.             System.out.println("get()等待结束,仓库现有数量为"+ container.size() +", 开始取出");  
  44.             return container.removeFirst();// 取出  
  45.         } finally {  
  46.             this.notifyAll(); // 通知其他线程  
  47.         }  
  48.     }  
  49. }</span>  


以下是测试代码:

[java] view plaincopy
  1. <span style="font-family:Arial;">  
  2. public class Test {  
  3.       
  4.     public static void main(String[] args) {  
  5.         Storage storage = new Storage();  
  6.           
  7.         // 生产者和消费者两个线程类,用的必须是同一个仓库,即同一个仓库对象storage  
  8.         Consumer con = new Consumer(storage);  
  9.         Producer pro = new Producer(storage);  
  10.           
  11.         new Thread(pro).start();  
  12.         new Thread(pro).start();  
  13.         new Thread(pro).start();  
  14.         new Thread(pro).start();  
  15.           
  16.           
  17. //      new Thread(con).start();  
  18. //      new Thread(con).start();  
  19. //      new Thread(con).start();  
  20. //      new Thread(con).start();  
  21.         new Thread(con).start();  
  22.     }  
  23. }</span>  

以下是测试代码结果:

get()等待结束,仓库现有数量为100, 开始取出
put()等待结束,仓库现有数量为99, 开始生产
get()等待结束,仓库现有数量为100, 开始取出
put()等待结束,仓库现有数量为99, 开始生产
get()等待结束,仓库现有数量为100, 开始取出
put()等待结束,仓库现有数量为99, 开始生产
get()等待结束,仓库现有数量为100, 开始取出
put()等待结束,仓库现有数量为99, 开始生产
get()等待结束,仓库现有数量为100, 开始取出
put()等待结束,仓库现有数量为99, 开始生产
get()等待结束,仓库现有数量为100, 开始取出
put()等待结束,仓库现有数量为99, 开始生产
get()等待结束,仓库现有数量为100, 开始取出
put()等待结束,仓库现有数量为99, 开始生产

分享到:
评论

相关推荐

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

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

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

    编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。

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

    本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能

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

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

    java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

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

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

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

    用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。

    Java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...

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

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

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释...Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58

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

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

    Java 线程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

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

    java多线程实现生产者消费者关系,完成线程之间的同步。

    Java实现消费者与生产者两个线程问题

    用Java实现消费者与生产者两个线程进行调度

    Java 线程间通信,生产者与消费者模型

    使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    java线程实现的生产者和消费者的程序

    java线程实现的生产者和消费者的程序java线程实现的生产者和消费者的程序

    生产者消费者问题 Java实现

    生产者消费者问题 Java实现 线程同步 线程通信生产者消费者问题 Java实现 线程同步 线程通信生产者消费者问题 Java实现 线程同步 线程通信

Global site tag (gtag.js) - Google Analytics