併發程式設計 優先順序阻塞佇列

2021-08-29 18:48:33 字數 851 閱讀 5792

優先順序阻塞佇列:priorityblockingqueue。

public static void main(string args) throws interruptedexception
task的比較方式為:

@override 

public int compareto(task task)

執行效果截圖:

容器:[task [id=1, name=我是t3], task [id=3, name=我是t2], task [id=2, name=我是t1]]

1容器:[task [id=2, name=我是t1], task [id=3, name=我是t2]]

2容器:[task [id=3, name=我是t2]]

3

問題:

排序時機:task放入佇列的順序為:t1、t2、t3,其對應的優先順序為1、2、3,然而執行效果卻顯示出task在佇列中的順序為:t3、t2、t1。

猜想:此順序是由佇列「fifo」的基本性質決定的,該佇列的優先順序在最開始並沒有對排序造成影響。即阻塞佇列的add()方法並沒有考慮優先順序關係。然而,在take方法之後,佇列中的元素排列明顯存在了一定的順序,即阻塞佇列的排序是在佇列取資料時進行的。這裡也顯示出一種程式設計思想:在元素進入佇列時不去對其進行排序,將排序的任務放在取資料時進行。事實真的如此嗎?我去看了一下priorityblockingqueue的add()和take()方法的原始碼,可能是能力有限,並沒有找到有力證據證明上面的猜想。所以,上面的猜想僅僅是根據執行時的顯示情況而得出,歡迎路過的大佬能夠針對上面的猜想給出肯定或者否的有力證明(我用的jdk是1.8版本)。

堆,阻塞佇列,優先順序佇列

arrayblockingqueue linkedblockingqueue integer.max value synchronusqueue 無鎖,不儲存元素 concurrentlinkedqueue 無鎖 非阻塞,不能用於執行緒池,執行緒安全,無界,入隊不用等待 cas 不用切換執行緒上下文...

佇列 優先順序佇列

優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去1.public class priorityq 插入 public void insert long item else quearray j 1 item nitem 刪除 public long ...

優先順序佇列

分為最小優先順序佇列和最大優先順序佇列。優先順序佇列是一種用來維護一組元素構成的集合s的資料結構,這一組元素都有乙個關鍵字key,乙個最大優先順序佇列支援的操作 insert s,x 把x插入到集合s中 maxmum s 返回s中最大元素 extra max s 去掉s中最大關鍵字並返回該最大關鍵子...