欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于java中BlockingQueue的使用介紹

 更新時(shí)間:2013年04月19日 14:20:24   作者:  
本篇文章小編為大家介紹,基于java中BlockingQueue的使用介紹。需要的朋友參考下
      最近在維護(hù)一個(gè)java工程,在群里面也就聊起來(lái)java的優(yōu)劣!無(wú)奈一些Java的終極粉絲,總是號(hào)稱(chēng)性能已經(jīng)不必C++差,并且很多標(biāo)準(zhǔn)類(lèi)庫(kù)都是大師級(jí)的人寫(xiě)的,如何如何穩(wěn)定等等。索性就認(rèn)真研究一番,他們給我的一項(xiàng)說(shuō)明就是,在線程之間投遞消息,用java已經(jīng)封裝好的BlockingQueue,就足夠用了。

      既然足夠用那就寫(xiě)代碼測(cè)試嘍,簡(jiǎn)簡(jiǎn)單單寫(xiě)一個(gè)小程序做了一番測(cè)試:
復(fù)制代碼 代碼如下:

//默認(rèn)包
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;
}

         傳遞十萬(wàn)條數(shù)據(jù),在我的測(cè)試機(jī)上面,大概需要50ms左右,倒是還可以!索性就看了一下BlockingQueue的底層實(shí)現(xiàn)

 我在上面的測(cè)試代碼中使用的offer 和 poll,就看看這兩個(gè)實(shí)現(xiàn)函數(shù)吧,首先是offer
復(fù)制代碼 代碼如下:

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

      和一般的同步線程類(lèi)似,只是多加了一個(gè)signal,在學(xué)習(xí)unix環(huán)境高級(jí)編程時(shí)候,看到條件變量用于線程之間的同步,可以實(shí)現(xiàn)線程以競(jìng)爭(zhēng)的方式實(shí)現(xiàn)同步!
poll函數(shù)的實(shí)現(xiàn)也是類(lèi)似!
復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • Java泛型在集合使用與自定義及繼承上的體現(xiàn)和通配符的使用

    Java泛型在集合使用與自定義及繼承上的體現(xiàn)和通配符的使用

    泛型又稱(chēng)參數(shù)化類(lèi)型,是Jdk5.0 出現(xiàn)的新特性,解決數(shù)據(jù)類(lèi)型的安全性問(wèn)題,在類(lèi)聲明或?qū)嵗瘯r(shí)只要指定好需要的具體的類(lèi)型即可。Java泛型可以保證如果程序在編譯時(shí)沒(méi)有發(fā)出警告,運(yùn)行時(shí)就不會(huì)產(chǎn)生ClassCastException異常。同時(shí),代碼更加簡(jiǎn)潔、健壯
    2021-09-09
  • Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩存方法

    Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩存方法

    本篇文章主要介紹了Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩存方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 詳解SpringMVC的url-pattern配置及原理剖析

    詳解SpringMVC的url-pattern配置及原理剖析

    這篇文章主要介紹了SpringMVC的url-pattern配置及原理剖析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Springboot使用JustAuth實(shí)現(xiàn)各種第三方登陸

    Springboot使用JustAuth實(shí)現(xiàn)各種第三方登陸

    本文主要介紹了Springboot使用JustAuth實(shí)現(xiàn)各種第三方登陸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java Swing JSlider滑塊的實(shí)現(xiàn)示例

    Java Swing JSlider滑塊的實(shí)現(xiàn)示例

    這篇文章主要介紹了Java Swing JSlider滑塊的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • java實(shí)現(xiàn)往hive 的map類(lèi)型字段寫(xiě)數(shù)據(jù)

    java實(shí)現(xiàn)往hive 的map類(lèi)型字段寫(xiě)數(shù)據(jù)

    這篇文章主要介紹了java實(shí)現(xiàn)往hive 的map類(lèi)型字段寫(xiě)數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Elasticsearch聚合查詢概念及字段類(lèi)型示例

    Elasticsearch聚合查詢概念及字段類(lèi)型示例

    這篇文章主要為大家介紹了Elasticsearch聚合查詢概念及字段類(lèi)型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 詳解Spring MVC自動(dòng)為對(duì)象注入枚舉類(lèi)型

    詳解Spring MVC自動(dòng)為對(duì)象注入枚舉類(lèi)型

    本篇文章主要介紹了Spring MVC自動(dòng)為對(duì)象注入枚舉類(lèi)型,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Java實(shí)現(xiàn)動(dòng)態(tài)獲取文件的絕對(duì)路徑

    Java實(shí)現(xiàn)動(dòng)態(tài)獲取文件的絕對(duì)路徑

    我們知道在?Java?中讀取一些配置文件信息,是在開(kāi)發(fā)中十分常用的要求。這篇文章就來(lái)和大家聊聊Java如何實(shí)現(xiàn)動(dòng)態(tài)獲取文件的絕對(duì)路徑,感興趣的可以了解一下
    2023-02-02
  • SpringBoot中RabbitMQ集群的搭建詳解

    SpringBoot中RabbitMQ集群的搭建詳解

    單個(gè)的?RabbitMQ?肯定無(wú)法實(shí)現(xiàn)高可用,要想高可用,還得上集群。這篇文章主要介紹了SpringBoot中RabbitMQ集群的兩種模式的搭建:普通集群搭建和鏡像集群搭建,需要的朋友可以參考一下
    2021-12-12

最新評(píng)論