博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈谈java的BlockingQueue
阅读量:5911 次
发布时间:2019-06-19

本文共 2425 字,大约阅读时间需要 8 分钟。

http://www.cnblogs.com/archy_yu/archive/2013/04/19/3018479.html

 

 

随笔- 92  文章- 0  评论- 825 

 

      最近在维护一个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/donaldlee2008/p/5433557.html

你可能感兴趣的文章
移动APP安全测试
查看>>
kvmgt-kernel 实现GPU虚拟化
查看>>
双斜线菜单
查看>>
5_添加购物车 B+M
查看>>
Python进阶07 函数对象【转】
查看>>
python 生成器 迭代器
查看>>
c#用牛顿法计算根号下2的值
查看>>
Java集合总结
查看>>
服务器发送数据到另一个服务器上中文出现乱码
查看>>
MySQL优化Explain命令简介(一)
查看>>
Excel导出纵向表格(poi)
查看>>
zeromq的几种模式(转)
查看>>
Linux 文件系统 的 学习
查看>>
学习日记(一)----BaseActivity的写法
查看>>
itunes 无法构建版本问题
查看>>
webpack
查看>>
0705作业
查看>>
如何在cowboy应用中指定mnesia数据库路径
查看>>
OPENGL 红宝书实验笔记
查看>>
c# 书
查看>>