最近在维护一个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相关推荐

  1. 谈谈JAVA中的安全发布

    谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级",看完之后很有共鸣.再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸,又掏出了<Java并发编程实战& ...

  2. 谈谈 Java 类加载机制

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源:Rainstorm , github.com/c-rainstorm/blog/blob/m ...

  3. 谈谈Java程序员进阶的那些知识和方向

    谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...

  4. blockingqueue java_记录 Java 的 BlockingQueue 中的一些坑

    最近学习了 BlockingQueue,发现 java 的 BlockingQueue 并不是每一个实现都按照 BlockingQueue 的语意来的,其中有不少坑. 直接上代码吧: 1.关于Prio ...

  5. Android 性能优化 之谈谈Java内存区域

    最近一年副业主要在学习投资和技能学习,把以前学习内存分析的一些笔记总结发出来,写了很多笔记总结都没有写完就又忙着了,最近再次总结复习学习一遍,还有提醒各位同学一定要学会投资.. 了解Android 内 ...

  6. java多核并行计算_谈谈Java任务的并行处理

    前言 谈到并行,我们可能最先想到的是线程,多个线程一起运行,来提高我们系统的整体处理速度:为什么使用多个线程就能提高处理速度,因为现在计算机普遍都是多核处理器,我们需要充分利用cpu资源:如果站的更高 ...

  7. java stream 求和_谈谈Java任务的并行处理

    作者:ksfzhaohui 前言 谈到并行,我们可能最先想到的是线程,多个线程一起运行,来提高我们系统的整体处理速度:为什么使用多个线程就能提高处理速度,因为现在计算机普遍都是多核处理器,我们需要充分 ...

  8. 谈谈 Java 的克隆

    转载自  谈谈 Java 的克隆 为什么要克隆对象 做开发很少用到克隆的.我能想得到的是用于调用方法时作为参数传递,为了保证方法调用前后对象的内部结构不被破坏,可以克隆一个对象作为参数传递. 使类具有 ...

  9. 谈谈Java虚拟机——Class文件结构

    谈谈Java虚拟机--Class文件结构 大家都知道,Java之所以如此受人喜欢,很大的原因是要规于它的跨平台性."一次编写,到处运行",Java诞生之时曾提出的著名的宣传口号,充 ...

最新文章

  1. c++服务器开源项目,开源一个c++ lua服务器框架
  2. 2016年2月工作日志
  3. WebGL(五)——WEBGL缓冲区,绘制三角形
  4. 厉害了!地大这位29岁博导,最大的爱好是研究火……
  5. c java json_cJSON_json包的C语言解析库
  6. cydia源_Cydia常见错误提示(红字/黄字)
  7. kettle 调用存储过程_Mysql存储过程
  8. ASP.NET MVC3 系列教程 - 如何使项目Debug进MVC3源代码
  9. mysql分组查询n条记录
  10. fatal error C1853: 'Debug/***.pch' is not a precompiled header file created with this compil
  11. 【09-06】数据结构学习笔记-图篇00
  12. 使用Intel NCS算力棒 安装部署记录 VirtualBox With Ubuntu16.04 Source Aliyun
  13. GD32f103介绍第二章
  14. 微信公众号程序开发接入流程
  15. win10运行python没有硬编码器_windows下关于python的编解码问题
  16. 解决Centos7网络连接的问题
  17. 虎胆龙威5java7723,汉米尔顿腕表联手《虎胆龙威5》再度演绎热血豪情
  18. Android开发——kotlin语法基础
  19. 用html5制作闹钟,HTM5制作的闹钟
  20. OA报销对接金蝶云星空

热门文章

  1. CodeChef Cards, bags and coins [DP 泛型背包]
  2. Apache用户认证配置文件
  3. 变电站越级跳闸的几大原因(转载)
  4. 深js, jsconf China 回顾
  5. 将Excel文件转换为Html
  6. 系统测试方案如何写?
  7. 【转】软件工程师的年终总结2
  8. js jquery关闭当前窗口
  9. Flomaster 2020中文版
  10. three.js写的游戏