您的位置:首页 > 编程语言 > Java开发

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

2015-08-09 17:02 796 查看
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);
		}
		
		
	}
	
	
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: