java使用阻塞队列实现生产者消费者模式
2015-08-09 17:02
796 查看
Java 5之前实现同步存取时,可以使用普通的一个集合,然后在使用线程的协作和线程同步可以实现生产者,消费者模式,主要的技术就是用好,wait ,notify,notifyAll,sychronized这些关键字。而在java
5之后,可以使用组阻塞队列来实现,此方式大大简少了代码量,使得多线程编程更加容易,安全方面也有保障。
BlockingQueue接口是Queue的子接口,它的主要用途并不是作为容器,而是作为线程同步的的工具,因此他具有一个很明显的特性,当生产者线程试图向BlockingQueue放入元素时,如果队列已满,则线程被阻塞,当消费者线程试图从中取出一个元素时,如果队列为空,则该线程会被阻塞,正是因为它所具有这个特性,所以在程序中多个线程交替向BlockingQueue中放入元素,取出元素,它可以很好的控制线程之间的通信。
生成者
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); } } }
相关文章推荐
- HDU 5237 Base64 (Java大法好)
- 智渔课堂官方免费教程二(拓展):Java软件开发环境的安装与配置
- I学霸官方免费教程二(拓展):Java软件开发环境的安装与配置
- Java的date和以datetime为字段的数据库的处理办法
- Java查看List扩容后的容量
- 廖雪峰javascrip学习笔记<高级>
- [笔记][Java7并发编程实战手册]2.5使用Lock实现同步一
- Java构造方法
- corejava知识---【一】
- 属性名前两个字母要么都是大写的要么都是小写的(当然数字与_、$算小写)
- java synchronized静态同步方法与非静态同步方法,同步语句块
- Java回顾之I/O
- Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)
- java中classpath的详解
- JAVA字节流(读写文件)
- 【Java多线程】之十:Timer and TimerTask
- 华为上机 循环报数 java
- 浅析Java中的反射机制原理
- JAVA的整型与字符串相互转换
- struts注解(新旧对比)