`
zl378837964
  • 浏览: 189705 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

用blocking queue实现生产者消费者

    博客分类:
  • java
阅读更多
就前一篇的类似操作,也是看到一篇面试题,练习了一下用blockingQueue;
似乎我感觉有点儿问题,但是不知道在哪儿,当局者迷,欢迎指正,谢谢

/*
                      ArrayBlockingQueue<Product0>(1);
  为何会出现:同时两个空间的容量呢
  生产者 1号[4--呵呵]
生产者 1号[5--呵呵]
消费者 1号[4--呵呵]
消费者 1号[5--呵呵]
生产者 1号[6--呵呵]
消费者 1号[6--呵呵]  
*/

package com.pdsu.zhang.thread;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class Pro_Cus_BlockingQueue {
	/**
	 * @param args
	 * @author zhangli
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		BlockingQueue<Product0> q = new ArrayBlockingQueue<Product0>(1);
	     Producer0 p = new Producer0(q);
	     Consumer c1 = new Consumer(q);
	     Consumer c2 = new Consumer(q);
	     new Thread(p,"生产者 1号").start();
	     new Thread(c1,"消费者 1号").start();
	     new Thread(c2,"消费者 2号").start();
	}
}
class Product0 {						 //	产品
	private int ID;
	private String name;
	
	public Product0(int id, String name) {
		ID = id;
		this.name = name;
	}
	@Override
	public String toString() {
		return  "["+ID+"--"+name+"]";	
	}	
}

class Producer0 implements Runnable {
	   private final BlockingQueue<Product0> queue;
	   Producer0(BlockingQueue<Product0> q) { queue = q; }
	   Product0 temp;
	   int id=0;
	   public void run() {
	     try {
	       while(true) {
	    	   	   Thread.sleep(500);
		    	   temp= produce();
		    	   queue.put(temp); 
		    	   System.out.println(Thread.currentThread().getName()+temp.toString());	    	   
	    	}
	     } catch (InterruptedException ex) { ex.printStackTrace();}
	   }
	   Product0 produce() { return new Product0(id++,"呵呵");}
	 }
class Consumer implements Runnable {
	   private final BlockingQueue<Product0> queue;
	   Consumer(BlockingQueue<Product0> q) { queue = q; }
	   public void run() {
	     try {
	       while(true) {
	    		   Thread.sleep(1000);
		    	   consume(queue.take());	    	
	    	 }
	     } catch (InterruptedException ex) { ex.printStackTrace();}
	   }
	   void consume(Product0 x) { System.out.println(Thread.currentThread().getName()+x.toString()); }
	 }


分享到:
评论

相关推荐

    Blocking Queue Usage

    在Java并发编程中,Blocking Queue(阻塞队列)是一个非常重要的工具类,它结合了线程同步与队列数据结构,有效地实现了生产者消费者模式。 Blocking Queue接口位于java.util.concurrent包下,它提供了一种在多线程...

    spring MVC 初始启动blocking queue

    `BlockingQueue`实现了`Queue`接口,并添加了阻塞操作,这意味着当队列满时,生产者线程会阻塞直到有空间可用;同样,当队列为空时,消费者线程也会阻塞直到有元素可取。这种设计有效地避免了忙等待,提高了系统的...

    sheng xiao.rar_生产者消费者

    通常,开发者会在这些文件中找到具体的实现细节,如如何使用Java的`BlockingQueue`实现生产者消费者模型,或者如何使用Python的`threading`库中的锁和条件变量来同步生产者和消费者。 总结来说,"生产者消费者"模式...

    linux_queue_message.rar_Linux message_linux blocking_queue_linux

    这种特性使得消息队列能有效地协调生产者和消费者之间的速度差异,避免了资源浪费。 在实际编程中,使用消息队列可以实现线程间的高效通信。例如,在“消息队列程序”中,可能包含了如何创建线程,如何在不同线程间...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    阻塞队列是Java中并发编程的一个重要组件,它属于Java.util.concurrent包中的一部分。...使用阻塞队列能够极大地简化生产者和消费者模型的实现,并且能够在多线程环境中更加有效地管理资源和任务。

    C++写的跨平台BlockingQueue

    在实际项目中,`BlockingQueue`常用于生产者-消费者模型,或者作为线程间数据传递的媒介,它的存在极大地简化了多线程编程中的同步问题。开发者可以根据具体需求调整队列的大小、优化等待策略,甚至添加超时机制等。...

    BlockingFQueue:基于磁盘持久存储的阻塞队列(Fast and Persistent Blocking Queue)

    在Java编程中,阻塞队列(Blocking Queue)是一种线程安全的数据结构,它在并发编程中扮演着重要角色,用于实现生产者消费者模型。通常,Java中的阻塞队列如`ArrayBlockingQueue`、`LinkedBlockingQueue`等都是内存...

    lock-free circular array queue.

    1. `array_lock_free_queue_impl.h` 和 `array_lock_free_queue_single_producer_impl.h`:这是无锁队列的具体实现,分别对应多生产者和单生产者的场景。 2. `array_lock_free_queue.h` 和 `array_lock_free_queue_...

    【每日爬虫】:生产者与消费者模式爬取王者荣耀壁纸

    生产者消费者模式的核心机制是通过一个中间容器,通常是一个阻塞队列(Blocking Queue),来协调两者之间的操作。阻塞队列是一种特殊的队列,它具有阻塞功能,即当队列为空时,尝试从队列中取数据的消费者线程会被...

    producer-consumer-model:生产者-消费者模型

    在Java中,实现生产者-消费者模型通常依赖于Java的并发库,如`java.util.concurrent`包下的`BlockingQueue`接口及其实现,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。`BlockingQueue`提供了一种线程安全的...

    java阻塞队列实现原理及实例解析.docx

    在多线程编程中,阻塞队列常用于实现生产者-消费者模型,其中生产者线程负责向队列中添加元素,消费者线程则负责消费这些元素。由于阻塞队列能自动处理线程间的同步,因此可以简化代码并提高系统的可伸缩性。此外,...

    JMS OPENJMS的实现例子

    JMS的核心概念包括生产者(Producer)、消费者(Consumer)、队列(Queue)和主题(Topic)。生产者创建并发送消息到队列或主题,而消费者则从这些目标接收消息。队列遵循FIFO(先进先出)原则,确保每个消息仅被一...

    3.1.7.阻塞队列、原子操作的原理分析1

    通过阻塞队列,我们可以实现生产者消费者模型,降低组件之间的耦合,提高系统性能。而原子操作则提供了无锁的并发控制,保证了多线程环境中的数据一致性。理解并熟练运用这些概念,对于编写高效、可靠的并发程序至关...

    java线程聊天室(阻塞队列实现)

    这种机制使得生产者线程在队列满时不会过度生产,消费者线程在队列空时也不会过度消费,从而保证了系统的稳定性和资源的有效利用。 在Java中,阻塞队列的实现类包括ArrayBlockingQueue、LinkedBlockingQueue、...

    let-prove-blocking-queue:以多种方式证明阻塞队列的死锁状态

    阻塞队列是一种在多线程并发环境中广泛使用的数据结构,它允许生产者线程将元素放入队列,而消费者线程则从队列中取出元素。在某些情况下,如果设计不当,阻塞队列可能会导致死锁,即多个线程相互等待对方释放资源,...

    blocking-queue:COEN 283 的阻塞队列项目

    阻塞队列 COEN 283 的阻塞队列项目 通过阻塞队列传递消息 使用同步的消息缓冲区使用队列来实现阻塞队列,并在队列为空/满时进行自旋等待。 无锁消息缓冲区创建环形缓冲区;...线程观察者监控线程生产者和消费者的效率

    基于java中BlockingQueue的使用介绍

    Java的并发编程框架提供了多种高级并发工具,其中BlockingQueue是一种非常实用的数据结构,它实现了生产者-消费者模式。在多线程环境下,BlockingQueue可以高效地处理线程间的通信,确保数据的安全共享。本文将深入...

    支持多线程和泛型的阻塞队列

    这种设计模式在生产者-消费者问题中非常常见,它可以有效地协调生产者和消费者的执行速度,避免资源浪费。 ### 多线程支持 多线程环境下,阻塞队列可以确保数据的正确性,避免竞态条件。在Java中,`java.util....

    Java_0613_java_源码

    这种设计使得生产者和消费者可以协同工作,无需担心数据同步问题。 该队列的核心特性是其内部采用了二叉堆(Binary Heap)的实现,这是一个自平衡的数据结构,保证了插入和删除操作的时间复杂度为O(logn)。元素之间...

Global site tag (gtag.js) - Google Analytics