java中併發Queue種類與各自API特點以及使用場景!
一 先說下佇列
佇列是一種資料結構.它有兩個基本操作:在佇列尾部加入一個元素,和從佇列頭部移除一個元素(注意不要弄混佇列的頭部和尾部)
就是說,佇列以一種先進先出的方式管理資料,如果你試圖向一個 已經滿了的阻塞佇列中新增一個元素或者是從一個空的阻塞佇列中移除一個元索,將導致執行緒阻塞.
在多執行緒進行合作時,阻塞佇列是很有用的工具。工作者執行緒可以定期地把中間結果存到阻塞佇列中而其他工作者執行緒把中間結果取出並在將來修改它們。佇列會自動平衡負載。
如果第一個執行緒集執行得比第二個慢,則第二個 執行緒集在等待結果時就會阻塞。如果第一個執行緒集執行得快,那麼它將等待第二個執行緒集趕上來.
說白了,就是先進先出,執行緒安全!
java中併發佇列都是在java.util.concurrent併發包下的,Queue介面與List、Set同一級別,都是繼承了Collection介面,最近學習了java中的併發Queue的所有子類應用場景,這裡記錄分享一下:
1.1 這裡可以先用wait與notify(腦忒fai) 模擬一下佇列的增刪資料,簡單瞭解一下佇列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
|
這裡用執行緒通訊的方式簡單模擬了佇列的進出,那麼接下來就正式進入java的併發佇列:
二 併發Queue
JDK中併發佇列提供了兩種實現,一種是高效能佇列ConcurrentLinkedQueue,一種是阻塞佇列BlockingQueue,兩種都繼承自Queue:
1 ConcurrentLinkedQueue
這是一個使用於高併發場景的佇列(額,各位看這塊部落格的小朋友,最好對執行緒基礎比較熟悉再來看,當然我也在拼命學習啦,哈哈哈),主要是無鎖的方式,他的想能要比BlockingQueue好
,是基於連結節點的無界執行緒安全佇列,先進先出,不允許有null元素,廢話不多說,上demo:
這種queue比較簡單,沒什麼好說的,和ArrayList一樣用就可以,關鍵是BlockingQUeue
2 BlockingQueue
blockingQueue主要有5中實現,我感覺都挺有意思的,其中幾種還比較常用就都學習了下,這裡都介紹下:
2.1 ArrayBlockingQueue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
2.2 LinkedBlockingQueue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
2.3 SynchronousQueue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
2.4 PriorityBlockingQueue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
2.5 最後說一下DelayQueue ,這裡用個網上很經典的例子,網咖上網計時
網民實體queue中元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
網咖類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
這樣就可以完美實現業務需求了,
結果,
這塊東西比較深,還需要不斷加強學習實踐才行!!