java中queue的用法_基于java中BlockingQueue的使用介绍

本文通过实战案例介绍Java中BlockingQueue的使用方法及其性能表现。测试显示传递十万条数据仅需约50毫秒,验证了其在线程间传递消息的有效性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章小编为大家介绍,基于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 queue = new LinkedBlockingQueue();

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 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 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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值