<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ā)編程

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

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

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

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

    拋出異常

    返回特殊值

    操作描述

    插入

    add(e)

    offer(e)

    將元素加入到隊(duì)列尾部

    移除

    remove()

    poll()

    移除隊(duì)列頭部的元素

    檢查

    element()

    peek()

    返回隊(duì)列頭部的元素而不移除此元素

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

     

    image

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

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

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

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

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

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

     

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

     

     



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

    評(píng)論

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊(duì)列與Queue簡(jiǎn)介 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ù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊(duì)列與Queue簡(jiǎn)介 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ù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊(duì)列與Queue簡(jiǎn)介 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ù)  更多評(píng)論
      

    # re: 深入淺出 Java Concurrency (19): 并發(fā)容器 part 4 并發(fā)隊(duì)列與Queue簡(jiǎn)介 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ù)  更多評(píng)論
      

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

      回復(fù)  更多評(píng)論
      


    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 成年人网站免费视频| 日本一区二区在线免费观看 | 国产91色综合久久免费| 亚洲精品免费视频| 久久精品无码专区免费东京热| 久久免费高清视频| 免费国产黄网站在线观看可以下载| 国产一级片免费看| 无码av免费一区二区三区试看| 日韩人妻一区二区三区免费| 91av免费观看| 国产无人区码卡二卡三卡免费 | 91视频免费网址| 97碰公开在线观看免费视频| 噼里啪啦免费观看高清动漫4 | a级片在线免费看| 久久久免费的精品| 成人浮力影院免费看| 女人张开腿等男人桶免费视频 | 午夜视频免费在线观看| 最近在线2018视频免费观看| 国产h视频在线观看免费| 热99re久久精品精品免费| 啊灬啊灬别停啊灬用力啊免费看| 亚洲人成影院在线观看| 国产AV无码专区亚洲A∨毛片| 亚洲人成在线播放网站岛国| 久久狠狠爱亚洲综合影院| 国产成人高清亚洲一区久久| 久久精品免费大片国产大片| 69视频在线是免费观看| 大陆一级毛片免费视频观看| 国产黄色一级毛片亚洲黄片大全| 亚洲av永久无码精品表情包| 色偷偷亚洲女人天堂观看欧| 男男gay做爽爽的视频免费| 一个人免费视频在线观看www| 日韩版码免费福利视频| | 精品熟女少妇aⅴ免费久久| 真实国产乱子伦精品免费|