xylz,imxylz

          關注后端架構、中間件、分布式和并發編程

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

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

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

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

          拋出異常

          返回特殊值

          操作描述

          插入

          add(e)

          offer(e)

          將元素加入到隊列尾部

          移除

          remove()

          poll()

          移除隊列頭部的元素

          檢查

          element()

          peek()

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

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

           

          image

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

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

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

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

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

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

           

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

           

           



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

          評論

          # re: 深入淺出 Java Concurrency (19): 并發容器 part 4 并發隊列與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/  回復  更多評論
            

          # re: 深入淺出 Java Concurrency (19): 并發容器 part 4 并發隊列與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.

            回復  更多評論
            

          # re: 深入淺出 Java Concurrency (19): 并發容器 part 4 并發隊列與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   回復  更多評論
            

          # re: 深入淺出 Java Concurrency (19): 并發容器 part 4 并發隊列與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 ?
            回復  更多評論
            

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

            回復  更多評論
            


          ©2009-2014 IMXYLZ
          主站蜘蛛池模板: 嘉义市| 阿拉善左旗| 中方县| 屏东县| 察隅县| 若羌县| 龙胜| 交城县| 新宁县| 拜城县| 马边| 珲春市| 大石桥市| 乌兰浩特市| 赤城县| 焉耆| 马边| 怀化市| 乌兰察布市| 曲松县| 莱西市| 阿克| 大渡口区| 岑溪市| 图木舒克市| 边坝县| 乌拉特前旗| 泸定县| 武安市| 余江县| 柳江县| 平果县| 南部县| 达州市| 思茅市| 大荔县| 青铜峡市| 乐都县| 庆阳市| 灌阳县| 惠东县|