`

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

 
阅读更多

 

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

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

上一种方式是采用synchronized关键字实现生产者消费者的问题,那是传统的做法,现在采用jdk1.5语法的新增的并发机制实现,以下是仓库类的具体代码实现(生产者类、消费者类类均不变,请参考上一篇文章:《三种方式实现生产者消费者_1》)。

 

[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.     // 容器,为了使用方便,没有面向接口编程,使用LinkedList作为实现类  
  10.     private LinkedList<Object> container = new LinkedList<Object>();  
  11.       
  12.     private Lock lock = new ReentrantLock(); // 互斥锁,相当于synchronized  
  13.     private Condition getCondition = lock.newCondition();  
  14.     private Condition putCondition = lock.newCondition();  
  15.       
  16.     // 往仓库中存放一个产品:  
  17.     public void put(){  
  18.         lock.lock();  
  19.         try {  
  20.             while(container.size() == MAX_SIZE){  
  21.                 putCondition.await();// 生产者等待,并让消费者唤醒  
  22.             }  
  23.             sop("put()等待结束,仓库现有数量为"+ container.size() +", 开始生产");  
  24.               
  25.             /* 
  26.              * 试想一下:如果换成这种做法会有什么弊端: 
  27.              * int size = storage.size(); 
  28.              * sop("put()等待结束,仓库现有数量为"+ size +", 开始生产"); 
  29.              * while(size == MAX_SIZE){ 
  30.              *      putCondition.await(); 
  31.              * } 
  32.              * ... 
  33.              */  
  34.               
  35.             container.addLast(new Object());  
  36.               
  37.             //通知消费者消费  
  38.             getCondition.signal();  
  39.               
  40.         } catch(Exception e){  
  41.             throw new RuntimeException(e);  
  42.         } finally {  
  43.             lock.unlock(); // 释放资源  
  44.         }  
  45.     }  
  46.       
  47.     // 从仓库中取出一个产品:  
  48.     public void get(){  
  49.         lock.lock();  
  50.         try {  
  51.             while(container.size() == 0){  
  52.                 // 消费者等待,并让生产者唤醒  
  53.                 getCondition.await();  
  54.             }  
  55.             sop("get()等待结束,仓库现有数量为"+ container.size() +", 开始消费");  
  56.             Object obj = container.removeLast();  
  57.             // 通知生产者生产  
  58.             putCondition.signal();  
  59.             Thread.sleep(1000);  
  60.         } catch(Exception e){  
  61.             throw new RuntimeException(e);  
  62.         } finally {  
  63.             lock.unlock();  
  64.         }  
  65.     }  
  66.       
  67.     private static void sop(Object obj){  
  68.         System.out.println(obj);  
  69.     }  
  70. }  
  71.   
  72. </span>  
以下是测试代码:
[java] view plaincopy
  1. <span style="font-family:Arial;">public class Test {  
  2.       
  3.     public static void main(String[] args) {  
  4.         Storage storage = new Storage();  
  5.           
  6.         Consumer con = new Consumer(storage);  
  7.         Producer pro = new Producer(storage);  
  8.           
  9.         new Thread(pro).start();  
  10.         new Thread(pro).start();  
  11. //      new Thread(pro).start();  
  12. //      new Thread(pro).start();  
  13.           
  14.           
  15. //      new Thread(con).start();  
  16.         new Thread(con).start();  
  17.         new Thread(con).start();  
  18.         new Thread(con).start();  
  19.         new Thread(con).start();  
  20.     }  
  21. }  
  22. </span>  

测试结果:

get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费

分享到:
评论

相关推荐

    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