`
qindongliang1922
  • 浏览: 2188905 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117670
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126075
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60034
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71402
社区版块
存档分类
最新评论

java之使用阻塞队列实现生产者,消费者模式

阅读更多
在看代码之前,笔者先说几句题外话,生产者-消费者模式,一直是多线程编程中的经典设计模式,不仅仅提现在Java中,各个类C语言,以及其他的一些高级语言中都有实现,在Java 5之前,还没有出现阻塞队列的容器时,实现一个生产者消费者模式,相对来说比较复杂,代码量也比较大,最重要的是设计同步存取时更需要小心谨慎,一不小心就会带来莫名其妙的问题。


Java 5之前实现同步存取时,可以使用普通的一个集合,然后在使用线程的协作和线程同步可以实现生产者,消费者模式,主要的技术就是用好,wait ,notify,notifyAll,sychronized这些关键字。而在java 5之后,可以使用组阻塞队列来实现,此方式大大简少了代码量,使得多线程编程更加容易,安全方面也有保障。

BlockingQueue接口是Queue的子接口,它的主要用途并不是作为容器,而是作为线程同步的的工具,因此他具有一个很明显的特性,当生产者线程试图向BlockingQueue放入元素时,如果队列已满,则线程被阻塞,当消费者线程试图从中取出一个元素时,如果队列为空,则该线程会被阻塞,正是因为它所具有这个特性,所以在程序中多个线程交替向BlockingQueue中放入元素,取出元素,它可以很好的控制线程之间的通信。

下面给出代码实现
package com.queue;

import java.util.concurrent.BlockingQueue;

/***
 * 消费者
 * **/
public class Consumer extends Thread {
	/***
	 * 利用队列存储样品
	 * */
	 private BlockingQueue<String> bq;
	 public Consumer() {
		// TODO Auto-generated constructor stub
	}
	public Consumer(BlockingQueue<String> bq) {
		super();
		this.bq = bq;
	 
	}
	 
	
	@Override
	public void run() {
		
		while(true){
			System.out.println(getName()+"消费者准备消费集合元素");
			try{
				
				Thread.sleep(2000);
				//尝试取出元素,如果队列为空,则被线程阻塞
				bq.take();
				
			}catch(Exception e){
				e.printStackTrace();
			}
			
			System.out.println(getName()+"消费完成"+bq);
		}
		
	}
	 

	
	 
	
	  
	
	
}


package com.queue;

import java.util.concurrent.BlockingQueue;

/**
 * 生产者
 * **/
public class Producer  extends Thread{

	/***
	 * 利用队列存储样品
	 * */
	private BlockingQueue<String> bq;
	
	public Producer() {
		// TODO Auto-generated constructor stub
	}
	 
	public Producer(BlockingQueue<String> bq) {
	 
		this.bq = bq;
	}

	@Override
	public void run() {
		String []str=new String[]{"solr","lucene","nutch"}; 
		
		for(int i=0;i<99999999;i++){
			System.out.println(getName()+"生产者准备生产集合元素了!");
			try{
				Thread.sleep(2000);
				//尝试放入元素,如果对列已满,则线程被阻塞
				bq.put(str[i%3]);
				
			}catch(Exception e){
				e.printStackTrace();
			}
			System.out.println(getName()+"生产完成:"+bq);
		}
		
		
	}
	
	
}



package com.queue;

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

/**
 * 生产者,消费者测试
 * 
 * **/
public class BlockingQueueTest {
	
	public static void main(String[] args) {
		
		//创建一个容量为1的队列
		BlockingQueue<String> bq=new ArrayBlockingQueue<>(1);
		//启动三个生产者线程
		new Producer(bq).start();
		new Producer(bq).start();
		new Producer(bq).start();
		//启动一个消费者线程
		new Consumer(bq).start();
		
		
	}

}


Thread-0生产者准备生产集合元素了!
Thread-1生产者准备生产集合元素了!
Thread-2生产者准备生产集合元素了!
Thread-3消费者准备消费集合元素
Thread-0生产完成:[solr]
Thread-0生产者准备生产集合元素了!
Thread-3消费完成[]
Thread-3消费者准备消费集合元素
Thread-1生产完成:[solr]
Thread-1生产者准备生产集合元素了!
Thread-3消费完成[solr]
Thread-2生产完成:[solr]
Thread-2生产者准备生产集合元素了!
Thread-3消费者准备消费集合元素
Thread-3消费完成[lucene]
Thread-3消费者准备消费集合元素
Thread-0生产完成:[lucene]
Thread-0生产者准备生产集合元素了!


总之,利用好队列就可以用很少的代码量实现一个稳定,高效生产者,消费者模式,




分享到:
评论
2 楼 qindongliang1922 2014-11-25  
加油     
1 楼 taoshi 2014-11-25  
谢谢您分享.

相关推荐

    阻塞队列实现生产者消费者模式Java开发Java经验技巧共

    在"阻塞队列实现生产者消费者模式Java开发Java经验技巧共4页.pdf.zip"这个压缩包中,很可能是详细介绍了如何使用Java的阻塞队列来构建生产者消费者模式,可能包括以下知识点: 1. **阻塞队列接口**:首先,会介绍`...

    消息分发框架(基于JAVA阻塞队列实现、 生产者消费者模型)

    综上所述,"消息分发框架(基于JAVA阻塞队列实现、生产者消费者模型)"是一个关键的并发处理组件,通过Java提供的并发工具和设计模式,实现了高效、稳定的消息处理。在实际应用中,需要根据业务需求进行适当的性能...

    生产者/消费者模式 阻塞队列 LinkedBlockingQueue

    在Java中,阻塞队列(BlockingQueue)是一个很好的实现生产者/消费者模式的工具,而LinkedBlockingQueue则是Java并发包(java.util.concurrent)中提供的一个具体实现。 LinkedBlockingQueue是一个基于链表结构的...

    java实现生产者消费者

    在Java编程中,"生产者消费者"模式是一种典型的多线程问题解决模型,它通过共享资源来协调生产者和消费者之间的操作。这个模式的核心在于如何有效地管理资源的生产和消费,以避免生产过快导致资源浪费,或者消费者...

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

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

    java模拟阻塞队列

    阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而消费者则在队列空时被阻塞,这样可以避免无效的循环检查,提高程序的运行效率。 首先,我们需要了解什么是生产者-消费者模型。在...

    生产者与消费者 java实现

    本主题将深入探讨生产者与消费者模型的Java实现。 生产者与消费者问题的核心是有一个共享资源(例如,一个缓冲区),生产者不断地生产产品并放入缓冲区,而消费者则从缓冲区取出产品进行消费。关键在于确保生产者...

    生产者消费者模式在java中的应用

    在Java中实现生产者消费者模式,主要依赖于Java提供的并发工具类,如`BlockingQueue`接口以及其实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。这些队列具有线程安全的特性,能够有效地避免数据竞争和...

    java生产者消费者

    在Java中,实现生产者消费者模式主要有两种方式:使用阻塞队列(BlockingQueue)和使用wait/notify机制。 1. 阻塞队列(BlockingQueue)实现: Java的`java.util.concurrent`包提供了多种阻塞队列实现,如...

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

    4. **BlockingQueue阻塞队列**:Java的`java.util.concurrent`包提供了`BlockingQueue`接口,它是一种特殊的队列,可以在队列满时阻塞生产者,队列空时阻塞消费者,从而自动实现线程的同步和互斥。`put()`和`take()`...

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

    在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者模式。`BlockingQueue`接口是最常用的实现方式,它提供了线程安全的数据结构,可以用来作为生产者和消费者之间的缓冲区。例如,我们...

    Java 生产消费者模式

    通过这个练习,初学者可以理解如何在Java中实现生产消费者模式,包括使用阻塞队列、线程安全以及处理并发问题。对于资深工程师来说,此模式是多线程编程中的基础,了解其原理和实践有助于解决更复杂的并发问题。

    java 编写的生产者与消费者问题

    这个库提供了多种工具类,如Semaphore(信号量)、BlockingQueue(阻塞队列)和Condition(条件变量),这些都可以用来实现生产者-消费者模型。 1. **BlockingQueue**: 阻塞队列是一种特殊的队列,它具有线程安全的...

    Java多线程 BlockingQueue实现生产者消费者模型详解

    在Java中,我们可以使用BlockingQueue来实现生产者消费者模型,BlockingQueue是Queue的子类,它提供了一个线程安全的队列,可以用于生产者和消费者之间的数据传输。 BlockingQueue的实现类有多种,常见的有...

    java生产者消费者demo

    在这个"java生产者消费者demo"中,开发者使用了适配器模式来构建解决方案。适配器模式是一种设计模式,它允许不同接口的类协同工作,即使它们原本无法直接交互。在生产者消费者问题中,适配器模式可能被用来协调生产...

    java生产者消费者模型

    在`src`目录下,可能包含示例代码或者练习题,它们通常会展示如何使用Java的并发API来实现生产者消费者模型。通过分析和理解这些代码,你可以深入学习如何在实际项目中运用这一模型解决并发问题。例如,创建两个线程...

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

    在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者和消费者模式。主要涉及到的类有`BlockingQueue`(阻塞队列)和`Thread`(线程)。阻塞队列是一种特殊的队列,当队列为空时,尝试获取元素的...

    界面话模拟生产者消费者模式java

    - **阻塞队列(BlockingQueue)**:Java中的`BlockingQueue`接口用于实现生产者消费者模式的关键组件。它提供了一种线程安全的数据交换方式,当队列满时,生产者会被阻塞,直到消费者取走数据;反之,当队列空时,...

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

    BlockingQueue提供了一种线程安全的队列,它内置了同步机制,使得生产者在队列满时会被阻塞,消费者在队列空时也会被阻塞,直到条件满足后才能继续执行。 以下是一个简单的基于synchronized关键字和wait/notify机制...

    操作系统生产者与消费者问题Java简单模拟实现

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

Global site tag (gtag.js) - Google Analytics