谈谈java的BlockingQueue
最近在维护一个java工程,在群里面也就聊起来java的优劣!无奈一些Java的终极粉丝,总是号称性能已经不必C++差,并且很多标准类库都是大师级的人写的,如何如何稳定等等。索性就认真研究一番,他们给我的一项说明就是,在线程之间投递消息,用java已经封装好的BlockingQueue,就足够用了。
既然足够用那就写代码测试喽,简简单单写一个小程序做了一番测试:
//默认包
import java.util.concurrent.*;import base.MyRunnable;public class Test
{public static void main(String[] args){BlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>();java.lang.Runnable r = new MyRunnable(queue);Thread t = new Thread(r);t.start();while(true){try{while(true){for(int i =0;i < 10000;i++){queue.offer(i);}}}catch ( Exception e){e.printStackTrace();}}}
}//需要添加的包
package base;import java.lang.Runnable;
import java.util.concurrent.*;
import java.util.*;public class MyRunnable implements Runnable
{public MyRunnable(BlockingQueue<Integer> queue){this.queue = queue;}public void run(){Date d = new Date();long starttime = d.getTime();System.err.println(starttime);int count = 0;while(true){try{Integer i = this.queue.poll();if(i != null){count ++;}if(count == 100000){Date e = new Date();long endtime = e.getTime();System.err.println(count);System.err.println(endtime);System.err.print(endtime - starttime);break;}}catch (Exception e){}}}private BlockingQueue<Integer> queue;
}
传递十万条数据,在我的测试机上面,大概需要50ms左右,倒是还可以!索性就看了一下BlockingQueue的底层实现
我在上面的测试代码中使用的offer 和 poll,就看看这两个实现函数吧,首先是offer
public E poll() {final AtomicInteger count = this.count;if (count.get() == 0)return null;E x = null;int c = -1;final ReentrantLock takeLock = this.takeLock;takeLock.lock();try {if (count.get() > 0) {x = extract();c = count.getAndDecrement();if (c > 1)notEmpty.signal();}} finally {takeLock.unlock();}if (c == capacity)signalNotFull();return x;}
和一般的同步线程类似,只是多加了一个signal,在学习unix环境高级编程时候,看到条件变量用于线程之间的同步,可以实现线程以竞争的方式实现同步!
poll函数的实现也是类似!
public boolean offer(E e) {if (e == null) throw new NullPointerException();final AtomicInteger count = this.count;if (count.get() == capacity)return false;int c = -1;final ReentrantLock putLock = this.putLock;putLock.lock();try {if (count.get() < capacity) {insert(e);c = count.getAndIncrement();if (c + 1 < capacity)notFull.signal();}} finally {putLock.unlock();}if (c == 0)signalNotEmpty();return c >= 0;}
转载于:https://www.cnblogs.com/archy_yu/archive/2013/04/19/3018479.html
谈谈java的BlockingQueue相关推荐
- 谈谈JAVA中的安全发布
谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级",看完之后很有共鸣.再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸,又掏出了<Java并发编程实战& ...
- 谈谈 Java 类加载机制
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源:Rainstorm , github.com/c-rainstorm/blog/blob/m ...
- 谈谈Java程序员进阶的那些知识和方向
谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...
- blockingqueue java_记录 Java 的 BlockingQueue 中的一些坑
最近学习了 BlockingQueue,发现 java 的 BlockingQueue 并不是每一个实现都按照 BlockingQueue 的语意来的,其中有不少坑. 直接上代码吧: 1.关于Prio ...
- Android 性能优化 之谈谈Java内存区域
最近一年副业主要在学习投资和技能学习,把以前学习内存分析的一些笔记总结发出来,写了很多笔记总结都没有写完就又忙着了,最近再次总结复习学习一遍,还有提醒各位同学一定要学会投资.. 了解Android 内 ...
- java多核并行计算_谈谈Java任务的并行处理
前言 谈到并行,我们可能最先想到的是线程,多个线程一起运行,来提高我们系统的整体处理速度:为什么使用多个线程就能提高处理速度,因为现在计算机普遍都是多核处理器,我们需要充分利用cpu资源:如果站的更高 ...
- java stream 求和_谈谈Java任务的并行处理
作者:ksfzhaohui 前言 谈到并行,我们可能最先想到的是线程,多个线程一起运行,来提高我们系统的整体处理速度:为什么使用多个线程就能提高处理速度,因为现在计算机普遍都是多核处理器,我们需要充分 ...
- 谈谈 Java 的克隆
转载自 谈谈 Java 的克隆 为什么要克隆对象 做开发很少用到克隆的.我能想得到的是用于调用方法时作为参数传递,为了保证方法调用前后对象的内部结构不被破坏,可以克隆一个对象作为参数传递. 使类具有 ...
- 谈谈Java虚拟机——Class文件结构
谈谈Java虚拟机--Class文件结构 大家都知道,Java之所以如此受人喜欢,很大的原因是要规于它的跨平台性."一次编写,到处运行",Java诞生之时曾提出的著名的宣传口号,充 ...
最新文章
- c++服务器开源项目,开源一个c++ lua服务器框架
- 2016年2月工作日志
- WebGL(五)——WEBGL缓冲区,绘制三角形
- 厉害了!地大这位29岁博导,最大的爱好是研究火……
- c java json_cJSON_json包的C语言解析库
- cydia源_Cydia常见错误提示(红字/黄字)
- kettle 调用存储过程_Mysql存储过程
- ASP.NET MVC3 系列教程 - 如何使项目Debug进MVC3源代码
- mysql分组查询n条记录
- fatal error C1853: 'Debug/***.pch' is not a precompiled header file created with this compil
- 【09-06】数据结构学习笔记-图篇00
- 使用Intel NCS算力棒 安装部署记录 VirtualBox With Ubuntu16.04 Source Aliyun
- GD32f103介绍第二章
- 微信公众号程序开发接入流程
- win10运行python没有硬编码器_windows下关于python的编解码问题
- 解决Centos7网络连接的问题
- 虎胆龙威5java7723,汉米尔顿腕表联手《虎胆龙威5》再度演绎热血豪情
- Android开发——kotlin语法基础
- 用html5制作闹钟,HTM5制作的闹钟
- OA报销对接金蝶云星空