<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關(guān)注后端架構(gòu)、中間件、分布式和并發(fā)編程

       :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

    Queue是JDK 5以后引入的新的集合類,它屬于Java Collections Framework的成員,在Collection集合中和List/Set是同一級別的接口。通常來講Queue描述的是一種FIFO的隊列,當(dāng)然不全都是,比如PriorityQueue是按照優(yōu)先級的順序(或者說是自然順序,借助于Comparator接口)。

    下圖描述了Java Collections Framework中Queue的整個家族體系。

    對于Queue而言是在Collection的基礎(chǔ)上增加了offer/remove/poll/element/peek方法,另外重新定義了add方法。對于這六個方法,有不同的定義。

    拋出異常

    返回特殊值

    操作描述

    插入

    add(e)

    offer(e)

    將元素加入到隊列尾部

    移除

    remove()

    poll()

    移除隊列頭部的元素

    檢查

    element()

    peek()

    返回隊列頭部的元素而不移除此元素

    特別說明的是對于Queue而言,規(guī)范并沒有規(guī)定是線程安全的,為了解決這個問題,引入了可阻塞的隊列BlockingQueue。對于BlockingQueue而言所有操作的是線程安全的,并且隊列的操作可以被阻塞,直到滿足某種條件。Queue的另一個子接口Deque描述的是一個雙向的隊列。與Queue不同的是,Deque允許在隊列的頭部增加元素和在隊列的尾部刪除元素。也就是說Deque是一個雙向隊列。二者功能都有的隊列就是BlockingDeque,這種阻塞隊列允許在隊列的頭和尾部分別操作元素,應(yīng)該說是Queue中功能最強大的實現(xiàn)。

     

    image

    在JDK 5之前LinkedList就已經(jīng)存在,而且本身實現(xiàn)都是一種雙向隊列。所以到了JDK 5以后就將LinkedList同時實現(xiàn)Deque接口,這樣LinkedList就又屬于Queue的一部分了。

    通常情況下Queue都是靠鏈表結(jié)構(gòu)實現(xiàn)的,但是鏈表意味著有一些而外的引用開銷,如果是雙向鏈表開銷就更大了。所以為了節(jié)省內(nèi)存,一種方式就是使用固定大小的數(shù)組來實現(xiàn)隊列。在這種情況下隊列的大小是固定,元素的遍歷通過數(shù)組的索引進行,很顯然這是一種雙向鏈表的模型。ArrayDeque就是這樣一種實現(xiàn)。

    另外ArrayBlockingQueue也是一種數(shù)組實現(xiàn)的隊列,但是卻沒有改造成雙向,僅僅實現(xiàn)了BlockingQueue的模型。理論上和ArrayDeque一樣也應(yīng)該容易改造成雙向的實現(xiàn)。

    PriorityQueue和PriorityBlockingQueue實現(xiàn)了一種排序的隊列模型。這很類似與SortedSet,通過隊列的Comparator接口或者Comparable元素來排序元素。這種情況下元素在隊列中的出入就不是按照FIFO的形式,而是根據(jù)比較后的自然順序來進行。

    CocurrentLinkedQueue是一種線程安全卻非阻塞的FIFO隊列,這種隊列通常實現(xiàn)起來比較簡單,但是卻很有效。在接下來的章節(jié)會詳細(xì)的描述它。

    SynchronousQueue是一種特別的BlockingQueue,它只是把一個add/offer操作的元素直接移交給remove/take操作。也就是說它本身不會緩存任何元素,所以嚴(yán)格意義上說來講并不是一種真正的隊列。此隊列維護一個線程列表,這些線程等待從隊列中加入元素或者移除元素。簡單的說,至少有一個remove/take操作時add/offer操作才能成功,同樣至少有一個add/offer操作時remove/take操作才能成功。這是一種雙向等待的隊列模型,出隊列等待加入等列,而入隊列又等待出隊列。這種隊列的好處在于能夠最大線程的保持吞吐量卻又是線程安全的。所以對于一個需要快速處理的任務(wù)隊列,SynchronousQueue是一個不錯的選擇。

     

    BlockingQueue還有一種實現(xiàn)DelayQueue,這種實現(xiàn)允許每一個元素(Delayed)帶有一個延時時間,當(dāng)調(diào)用take/poll的時候會檢測隊列頭元素這個時間是否<=0,如果滿足就是說已經(jīng)超時了,那么此元素就可以被移除了,否則就會等待。特別說明的是這個頭元素應(yīng)該是最先被超時的元素(這個時間是絕對時間)。這個類設(shè)計很巧妙,被用于ScheduledFutureTask來進行定時操作。希望后面會開辟一個章節(jié)講講這里面的想法。實在不行在講線程池部分肯定會提到這個。

     

     



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2010-07-21 12:21 imxylz 閱讀(21469) 評論(5)  編輯  收藏 所屬分類: Java Concurrency

    評論

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊列與Queue簡介 2010-07-21 12:46 zhxia
    e vais résumer mes recherches et ce que j'ai fait:
    Pour commencer j'ai windows XP et mon but et de pouvoir créer un custom widget, le prendre dans le designer, le déposer sur une QDialog et que le tout se lance.
    Je pars sur un custom widget simple et un qdialog simple c'est a dire je crée des nouveaux projets dans QtCreator sans modifier les fichiers générés. (un Qt Custom Designer Widget et un Qt Gui Application avec une class base QDialog)http://www.jeansclothingstore.com/  回復(fù)  更多評論
      

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊列與Queue簡介 2010-07-21 12:47 schmuck
    e vais résumer mes recherches et ce que j'ai fait:
    Pour commencer j'ai windows XP et mon but et de pouvoir créer un custom widget, le prendre dans le designer, le déposer sur une QDialog et que le tout se lance.

      回復(fù)  更多評論
      

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊列與Queue簡介 2010-07-21 12:48 links of london charms
    A ce moment là je dois dire que je pense que c'est gagné, je place mon widget dans ma fenêtre, je lance la compilation erreur trouve pas les .h du widget, j'ajoute dans le pro INCLUDEPATH += chemin des headers du custom je relance et la j'ai   回復(fù)  更多評論
      

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊列與Queue簡介 2010-07-21 12:49 links of london bracelets
    aut il ajouter d'autres options dans les pro du widget ou du qdialog ?
    Existe t'il un tutorial qui explique comment faire ça avec QtCreator 2 ?
      回復(fù)  更多評論
      

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊列與Queue簡介 2011-07-27 12:16 ikon
    jdk1.6下 ConcurrentLinkedQueue 的add 和 offer一樣了;add直接調(diào)用了offer方法。

      回復(fù)  更多評論
      


    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 久久亚洲国产成人精品性色| 亚洲人成人网站在线观看| 午夜老司机免费视频| 国产资源免费观看| 区久久AAA片69亚洲| 亚洲爆乳无码一区二区三区| 亚洲精品456在线播放| 亚洲丰满熟女一区二区哦| 丰满少妇作爱视频免费观看| 中文字幕免费不卡二区| 91久久成人免费| 免费少妇a级毛片人成网| 好看的电影网站亚洲一区| 亚洲乱码中文字幕小综合| 麻豆亚洲AV成人无码久久精品 | 毛片亚洲AV无码精品国产午夜| 一级做受视频免费是看美女| 95老司机免费福利| 四虎永久免费影院| 亚洲av无码不卡一区二区三区| 亚洲男人天堂2018av| 一区二区视频在线免费观看| 777爽死你无码免费看一二区| 日本一道在线日本一道高清不卡免费 | 国产精品99久久免费观看| 18禁成年无码免费网站无遮挡 | 成人免费看吃奶视频网站| 伊人久久大香线蕉亚洲| tom影院亚洲国产一区二区| 成在线人直播免费视频| 国产精品免费精品自在线观看| 亚洲福利精品一区二区三区 | 久久亚洲AV成人无码电影| 国产精品亚洲专区无码牛牛| 99视频在线看观免费| 四虎永久免费地址在线观看| 久久久无码精品亚洲日韩蜜臀浪潮 | 国产美女无遮挡免费视频| 亚洲国产精品久久| 美女视频黄视大全视频免费的| 91香蕉在线观看免费高清|