java中BlockingQueue的使用详细解析

来源:爱站网时间:2018-09-22编辑:网友分享
今天小编给大家分享一篇关于java中BlockingQueue的使用详细解析,感兴趣的朋友跟小编一起来了解一下吧!

  今天小编给大家分享一篇关于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

  {

  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()

  insert(e);

  c = count.getAndIncrement();

  if (c + 1

  notFull.signal();

  }

  } finally {

  putLock.unlock();

  }

  if (c == 0)

  signalNotEmpty();

  return c >= 0;

  }

  以上就是java中BlockingQueue的使用详细解析,想必都了解了吧,更多相关内容请继续关注爱站技术频道。

上一篇:Java里int和Integer的区别详细分析

下一篇:Java里static静态代码块的详细解析

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载