`

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

 
阅读更多

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

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

实现生产者——消费者问题的第三种方式:使用java5提供的java.util.concurrent.BlockingQueue阻塞队列实现,你可以看到仓库类代码实现更加简洁了。同样,生产者类、消费者类都不变化(《java线程:三种方式实现生产者消费者问题_1》),以下是仓库类的代码实现:

 

[java] view plaincopy
  1. <span style="font-family:Arial;">  
  2. /** 
  3.  * 仓库: 
  4.  * 先生产的先消费:采用JDK提供的阻塞队列实现生产者——消费者的问题 
  5.  */  
  6. public class Storage {  
  7.       
  8.     public static final int MAX_SIZE = 100;  
  9.     // 阻塞队列  
  10.     private BlockingQueue<Object> container = new ArrayBlockingQueue<Object>(MAX_SIZE);  
  11.       
  12.     // 从仓库中存放一个产品:  
  13.     public void put(){  
  14.         try {  
  15.             sop("仓库现有数量为"+ container.size() +", 开始生产");  
  16.             /*  
  17.              * 关于put()、offer()、add(): 
  18.              *      put() 
  19.              *          如果队列中数据已满,则等待,该方法是阻塞的 
  20.              *      offer() 
  21.              *          如果队列中数据已满,则返回插进队列的元素 
  22.              *      add() 
  23.              *          如果队列中数据已满,则抛出异常 
  24.              */  
  25.             container.put(new Object());  
  26.         } catch (InterruptedException e) {  
  27.         }  
  28.     }  
  29.       
  30.     // 从仓库中取出一个产品:  
  31.     public Object get(){  
  32.         Object obj = null;  
  33.         try {  
  34.             sop("仓库现有数量为"+ container.size() +", 开始消费");  
  35.             /* 
  36.              * 关于take()、poll()、remove(): 
  37.              *      take(): 
  38.              *          如果队列没有数据,则一直等待队列的头部,直到头元素可用,该方法是阻塞的 
  39.              *      poll(): 
  40.              *          如果队列没有数据,则在指定的时间内等待队列的头部 
  41.              *      remove(): 
  42.              *          如果队列中没有元素,则抛出异常 
  43.              */  
  44.             obj = container.take();  
  45.         } catch (InterruptedException e) {  
  46.         }  
  47.         return obj;  
  48.     }  
  49.       
  50.     private static void sop(Object obj){  
  51.         System.out.println(obj);  
  52.     }  
  53. }  
  54.   
  55. </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.         Consumer con = new Consumer(storage);  
  8.         Producer pro = new Producer(storage);  
  9.           
  10.         new Thread(pro).start();  
  11.         new Thread(pro).start();  
  12.         new Thread(pro).start();  
  13.         new Thread(pro).start();  
  14.           
  15.           
  16. //      new Thread(con).start();  
  17. //      new Thread(con).start();  
  18. //      new Thread(con).start();  
  19. //      new Thread(con).start();  
  20.         new Thread(con).start();  
  21.     }  
  22. }  
  23.  </span>  
分享到:
评论

相关推荐

    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