基于java中BlockingQueue的使用介绍

 更新时间:2013年04月19日 14:20:24   作者:  
本篇文章小编为大家介绍,基于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<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;
    }

相关文章

  • swagger如何返回map字段注释

    swagger如何返回map字段注释

    这篇文章主要介绍了swagger如何返回map字段注释的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringMVC中重定向model值的获取方式

    SpringMVC中重定向model值的获取方式

    这篇文章主要介绍了SpringMVC中重定向model值的获取方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot逻辑异常统一处理方法

    SpringBoot逻辑异常统一处理方法

    这篇文章主要介绍了SpringBoot逻辑异常统一处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringBoot解决跨域的5种方式小结

    SpringBoot解决跨域的5种方式小结

    在项目开发中,时常会遇到跨域问题,本文主要介绍了五种解决跨域的方法,使用最多的是第三种,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • java快速解析路径中的参数(&与=拼接的参数)

    java快速解析路径中的参数(&与=拼接的参数)

    这篇文章主要介绍了java快速解析路径中的参数(&与=拼接的参数),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-02-02
  • JavaFx 实现按钮防抖功能

    JavaFx 实现按钮防抖功能

    最近Sun公司推出了JavaFX框架,使用它可以利用JavaFX编程语言来开发富互联网应用程序(RIA),这篇文章主要介绍了JavaFx 实现按钮防抖功能,需要的朋友可以参考下
    2022-01-01
  • java.lang.ExceptionInInitializerError异常的解决方法

    java.lang.ExceptionInInitializerError异常的解决方法

    这篇文章主要为大家详细介绍了java.lang.ExceptionInInitializerError异常的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • SpringBoot中的JPA(Java Persistence API)详解

    SpringBoot中的JPA(Java Persistence API)详解

    这篇文章主要介绍了SpringBoot中的JPA(Java Persistence API)详解,JPA用于将 Java 对象映射到关系型数据库中,它提供了一种面向对象的方式来操作数据库,使得开发者可以更加方便地进行数据持久化操作,需要的朋友可以参考下
    2023-07-07
  • java web过滤器处理乱码

    java web过滤器处理乱码

    本文主要介绍了java web过滤器处理乱码的方法解析。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Java实现生成Excel树形表头完整代码示例

    Java实现生成Excel树形表头完整代码示例

    这篇文章主要介绍了Java实现生成Excel树形表头完整代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论