BlockingQueue的使用 http://www.cnblogs.com/liuling/p/2013-8-20-01.html
BlockingQueue的使用
本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue 是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果 BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.
使用BlockingQueue的关键技术点如下:
1.BlockingQueue定义的常用方法如下:
1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常
2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.
4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止
2.BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类
1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的.
2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的
BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含
的对象是以FIFO(先入先出)顺序排序的
3)PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序.
4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.
3.LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致
LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于
ArrayBlockingQueue.
下面是两个使用BlockingQueue的例子:

1 package com.thread;
2 import java.util.concurrent.ArrayBlockingQueue;
3 import java.util.concurrent.BlockingQueue;
4
5 public class BlockingQueueTest {
6 public static void main(String[] args) {
7 final BlockingQueue queue = new ArrayBlockingQueue(3);
8 for(int i=0;i<2;i++){
9 new Thread(){
10 public void run(){
11 while(true){
12 try {
13 Thread.sleep((long)(Math.random()*1000));
14 System.out.println(Thread.currentThread().getName() + "准备放数据!");
15 queue.put(1);
16 System.out.println(Thread.currentThread().getName() + "已经放了数据," +
17 "队列目前有" + queue.size() + "个数据");
18 } catch (InterruptedException e) {
19 e.printStackTrace();
20 }
21
22 }
23 }
24
25 }.start();
26 }
27
28 new Thread(){
29 public void run(){
30 while(true){
31 try {
32 //将此处的睡眠时间分别改为100和1000,观察运行结果
33 Thread.sleep(1000);
34 System.out.println(Thread.currentThread().getName() + "准备取数据!");
35 queue.take();
36 System.out.println(Thread.currentThread().getName() + "已经取走数据," +
37 "队列目前有" + queue.size() + "个数据");
38 } catch (InterruptedException e) {
39 e.printStackTrace();
40 }
41 }
42 }
43
44 }.start();
45 }
46 }


1 package com.thread;
2 import java.util.concurrent.ArrayBlockingQueue;
3 import java.util.concurrent.BlockingQueue;
4 import java.util.concurrent.ExecutorService;
5 import java.util.concurrent.Executors;
6 import java.util.concurrent.locks.Condition;
7 import java.util.concurrent.locks.Lock;
8 import java.util.concurrent.locks.ReentrantLock;
9
10 public class BlockingQueueCondition {
11
12 public static void main(String[] args) {
13 ExecutorService service = Executors.newSingleThreadExecutor();
14 final Business3 business = new Business3();
15 service.execute(new Runnable(){
16
17 public void run() {
18 for(int i=0;i<50;i++){
19 business.sub();
20 }
21 }
22
23 });
24
25 for(int i=0;i<50;i++){
26 business.main();
27 }
28 }
29
30 }
31
32 class Business3{
33 BlockingQueue subQueue = new ArrayBlockingQueue(1);
34 BlockingQueue mainQueue = new ArrayBlockingQueue(1);
35 //这里是匿名构造方法,只要new一个对象都会调用这个匿名构造方法,它与静态块不同,静态块只会执行一次,
36 //在类第一次加载到JVM的时候执行
37 //这里主要是让main线程首先put一个,就有东西可以取,如果不加这个匿名构造方法put一个的话程序就死锁了
38 {
39 try {
40 mainQueue.put(1);
41 } catch (InterruptedException e) {
42 e.printStackTrace();
43 }
44 }
45 public void sub(){
46 try
47 {
48 mainQueue.take();
49 for(int i=0;i<10;i++){
50 System.out.println(Thread.currentThread().getName() + " : " + i);
51 }
52 subQueue.put(1);
53 }catch(Exception e){
54
55 }
56 }
57
58 public void main(){
59
60 try
61 {
62 subQueue.take();
63 for(int i=0;i<5;i++){
64 System.out.println(Thread.currentThread().getName() + " : " + i);
65 }
66 mainQueue.put(1);
67 }catch(Exception e){
68 }
69 }
70 }

BlockingQueue的使用 http://www.cnblogs.com/liuling/p/2013-8-20-01.html的更多相关文章
- http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html
http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html
- json(http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html)
http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html
- http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html
http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html
- http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html
http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html
- http://www.cnblogs.com/draem0507/archive/2013/02/01/2889317.html
http://www.cnblogs.com/draem0507/archive/2013/02/01/2889317.html
- http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html
http://www.cnblogs.com/fczjuever/archive/2013/04/05/3000680.html
- http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html
- http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html深入理解Java:SimpleDateFormat安全的时间格式化
http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html
- http://www.cnblogs.com/langtianya/archive/2013/02/01/2889682.html
http://www.cnblogs.com/langtianya/archive/2013/02/01/2889682.html
随机推荐
- WPF--TextBox的验证
WPF--TextBox的验证
- [Android Traffic] 调整定时更新的频率(C2DM与退避算法)
转载自: http://blog.csdn.net/kesenhoo/article/details/7395253 Minimizing the Effect of Regular Updates[ ...
- ubuntu16.04 ssh服无法远程连接解决办法
1.安装ssh服务sudo apt-get install openssh-server 2.修改配置文件sudo vi /etc/ssh/sshd_config#PermitRootLogin wi ...
- 前端打包利器:webpack工具
一.什么是WebPack,为什么要使用它? 1.为什要使用WebPack 现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包.为了简化开发的复杂度,前端 ...
- Mybatis通用分页
分页分为真分页和假分页,而 MyBatis 本身没有提供基于数据库方言的分页功能,而是基于 JDBC 的游标分页,很容易出现性能问题.网上提供的一个解决方案感觉还不错,是基于 MyBatis 本身的插 ...
- 解决no declaration can be found for element 'context:component-scan'
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- CentOS7环境下SSH端口修改笔记
CentOS7环境下SSH端口修改笔记 说明: CentOS7服务器环境,默认SSH端口为22,考虑到安全方面问题,欲修改端口为62231(机器内网IP为192.168.1.31) ssh配置文件和i ...
- 2017.7.1 nginx反向代理服务器域名解析配置(已验证可使用)
下载地址:http://learning.happymmall.com/ 前提:ftpserver已经开启,并且设置为: 1.获得安装文件 2.修改配置文件 2.1 修改conf/nginx.conf ...
- [PWA] Access the Camera in a PWA built with React
It's possible to access some, but not all, of the native device features from a PWA. One that we can ...
- 系统重装 Windows_VHD_辅助处理工具说明文档1
菜鸟也玩 VHD Windows VHD 辅助处理工具是一个用于创建.安装.维护 VHD 的辅助工具,把一个比较复杂的操作过程傻瓜化,使您轻松体验 VHD 的强大功能.您需要预备的就是一个准备装入 V ...