基于java中BlockingQueue的使用介绍
JAVA 使用 基于 介绍 BlockingQueue
2023-06-13 09:14:50 时间
最近在维护一个java工程,在群里面也就聊起来java的优劣!无奈一些Java的终极粉丝,总是号称性能已经不必C++差,并且很多标准类库都是大师级的人写的,如何如何稳定等等。索性就认真研究一番,他们给我的一项说明就是,在线程之间投递消息,用java已经封装好的BlockingQueue,就足够用了。
既然足够用那就写代码测试喽,简简单单写一个小程序做了一番测试:
复制代码代码如下:
既然足够用那就写代码测试喽,简简单单写一个小程序做了一番测试:
//默认包
importjava.util.concurrent.*;
importbase.MyRunnable;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
BlockingQueue<Integer>queue=newLinkedBlockingQueue<Integer>();
java.lang.Runnabler=newMyRunnable(queue);
Threadt=newThread(r);
t.start();
while(true)
{
try
{
while(true)
{
for(inti=0;i<10000;i++)
{
queue.offer(i);
}
}
}
catch(Exceptione)
{
e.printStackTrace();
}
}
}
}
//需要添加的包
packagebase;
importjava.lang.Runnable;
importjava.util.concurrent.*;
importjava.util.*;
publicclassMyRunnableimplementsRunnable
{
publicMyRunnable(BlockingQueue<Integer>queue)
{
this.queue=queue;
}
publicvoidrun()
{
Dated=newDate();
longstarttime=d.getTime();
System.err.println(starttime);
intcount=0;
while(true)
{
try
{
Integeri=this.queue.poll();
if(i!=null)
{
count++;
}
if(count==100000)
{
Datee=newDate();
longendtime=e.getTime();
System.err.println(count);
System.err.println(endtime);
System.err.print(endtime-starttime);
break;
}
}
catch(Exceptione)
{
}
}
}
privateBlockingQueue<Integer>queue;
}
传递十万条数据,在我的测试机上面,大概需要50ms左右,倒是还可以!索性就看了一下BlockingQueue的底层实现
我在上面的测试代码中使用的offer和poll,就看看这两个实现函数吧,首先是offer
publicEpoll(){
finalAtomicIntegercount=this.count;
if(count.get()==0)
returnnull;
Ex=null;
intc=-1;
finalReentrantLocktakeLock=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();
returnx;
}
和一般的同步线程类似,只是多加了一个signal,在学习unix环境高级编程时候,看到条件变量用于线程之间的同步,可以实现线程以竞争的方式实现同步!
poll函数的实现也是类似!
publicbooleanoffer(Ee){
if(e==null)thrownewNullPointerException();
finalAtomicIntegercount=this.count;
if(count.get()==capacity)
returnfalse;
intc=-1;
finalReentrantLockputLock=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();
returnc>=0;
}
相关文章
- java分层打印二叉树_基于Java的二叉树层序遍历打印实现
- java %08d_总结Java中String.format()的使用[通俗易懂]
- java axis_Java 使用Axis实现WebService实例
- 数据如何使用Java读取MySQL数据(java读取mysql)
- 服务器使用Java进行Linux服务器监控(java监控linux)
- Linux下配置Java环境变量的简易指南(linux配置java环境变量)
- 时间使用Java设置Redis中Key的过期时间(redisjava过期)
- 实战探索:Java中使用Redis缓存(java的redis案例)
- 应用『Java应用程序中Redis缓存的使用』(redis缓存与java)
- 策略处理Redis中Java使用过期策略的有效方法(redisjava过期)
- Java文件在Linux系统中的使用(java文件linux)
- 使用Redis优化Java开发的关键技巧(redis与java开发)
- 使用Linux平台快速搭建Java应用,加速下载与部署——基于Java镜像的部署实践(linuxjava镜像)
- 使用Java去连接MySQL数据库(java jdbc mysql)
- 使用Java程序执行Linux指令:实现自动化操作(java执行linux命令)
- Java迭代Oracle实现数据库更高性能(java迭代oracle)
- 进行操作学会使用Java玩转Redis(在java中队redis)
- Redis中使用Java快速实现自增(redis自增 java)
- 深入java线程池的使用详解
- java使用ftp上传文件示例分享
- java的nio的使用示例分享
- java使用smartupload组件实现文件上传的方法