`

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多线程实现生产者和消费者

    `BlockingQueue`接口提供了线程安全的队列,自动处理了等待和唤醒操作,是实现生产者-消费者模型的一种高效方式。 4. **条件变量**:`wait()`, `notify()`和`notifyAll()`是基于条件变量的,它们可以使得线程在特定...

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

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

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

    在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...

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

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

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

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

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

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

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

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

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

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

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

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

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

    4. **阻塞队列(BlockingQueue)**:Java并发包(java.util.concurrent)中的阻塞队列是实现生产者消费者模式的理想选择。它们在内部已经处理了线程同步和等待,提供了一种高效且安全的共享数据方式。例如,`put()`...

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

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

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

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

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

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

    Java多线程编程总结

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

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

    Java线程实现的生产者和消费者程序是一种经典的多线程设计模式,用于处理并发操作中的数据共享问题。这种模式在实际编程中广泛应用,特别是在需要高效处理数据流和资源管理的系统中。以下将详细讲解其核心概念、实现...

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

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

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

    - `BlockingQueue` 是JAVA集合框架的一部分,提供了一个线程安全的方式来实现生产者/消费者模型。 - 它提供了`put()` 和 `take()` 等方法,这些方法会在队列满或空时自动阻塞当前线程,直到条件满足为止。 使用`...

    生产者与消费者 java实现

    生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...

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

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

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

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

Global site tag (gtag.js) - Google Analytics