最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于java中BlockingQueue的使用介紹

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

      既然足夠用那就寫代碼測試嘍,簡簡單單寫一個小程序做了一番測試:
復(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;
}

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

 我在上面的測試代碼中使用的offer 和 poll,就看看這兩個實現(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;
    }

      和一般的同步線程類似,只是多加了一個signal,在學(xué)習(xí)unix環(huán)境高級編程時候,看到條件變量用于線程之間的同步,可以實現(xiàn)線程以競爭的方式實現(xiàn)同步!
poll函數(shù)的實現(xiàn)也是類似!
復(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)文章

  • swagger如何返回map字段注釋

    swagger如何返回map字段注釋

    這篇文章主要介紹了swagger如何返回map字段注釋的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringMVC中重定向model值的獲取方式

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

    這篇文章主要介紹了SpringMVC中重定向model值的獲取方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot邏輯異常統(tǒng)一處理方法

    SpringBoot邏輯異常統(tǒng)一處理方法

    這篇文章主要介紹了SpringBoot邏輯異常統(tǒng)一處理方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot解決跨域的5種方式小結(jié)

    SpringBoot解決跨域的5種方式小結(jié)

    在項目開發(fā)中,時常會遇到跨域問題,本文主要介紹了五種解決跨域的方法,使用最多的是第三種,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • java快速解析路徑中的參數(shù)(&與=拼接的參數(shù))

    java快速解析路徑中的參數(shù)(&與=拼接的參數(shù))

    這篇文章主要介紹了java快速解析路徑中的參數(shù)(&與=拼接的參數(shù)),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-02-02
  • JavaFx 實現(xiàn)按鈕防抖功能

    JavaFx 實現(xiàn)按鈕防抖功能

    最近Sun公司推出了JavaFX框架,使用它可以利用JavaFX編程語言來開發(fā)富互聯(lián)網(wǎng)應(yīng)用程序(RIA),這篇文章主要介紹了JavaFx 實現(xiàn)按鈕防抖功能,需要的朋友可以參考下
    2022-01-01
  • java.lang.ExceptionInInitializerError異常的解決方法

    java.lang.ExceptionInInitializerError異常的解決方法

    這篇文章主要為大家詳細(xì)介紹了java.lang.ExceptionInInitializerError異常的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • SpringBoot中的JPA(Java?Persistence?API)詳解

    SpringBoot中的JPA(Java?Persistence?API)詳解

    這篇文章主要介紹了SpringBoot中的JPA(Java?Persistence?API)詳解,JPA用于將?Java?對象映射到關(guān)系型數(shù)據(jù)庫中,它提供了一種面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫,使得開發(fā)者可以更加方便地進(jìn)行數(shù)據(jù)持久化操作,需要的朋友可以參考下
    2023-07-07
  • java web過濾器處理亂碼

    java web過濾器處理亂碼

    本文主要介紹了java web過濾器處理亂碼的方法解析。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Java實現(xiàn)生成Excel樹形表頭完整代碼示例

    Java實現(xiàn)生成Excel樹形表頭完整代碼示例

    這篇文章主要介紹了Java實現(xiàn)生成Excel樹形表頭完整代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12

最新評論

平顶山市| 克拉玛依市| 墨江| 都昌县| 黔西县| 剑阁县| 泰顺县| 岳普湖县| 凉城县| 青田县| 宝鸡市| 龙州县| 长垣县| 天长市| 太原市| 句容市| 吉安县| 福安市| 吴川市| 田阳县| 石柱| 邓州市| 仪陇县| 布尔津县| 井陉县| 合川市| 温宿县| 东乡族自治县| 邯郸县| 星子县| 正阳县| 固阳县| 鹰潭市| 大方县| 瓦房店市| 汉阴县| 太原市| 沾化县| 义马市| 永平县| 磴口县|