濃濃棕情之自產自消

2021-10-07 12:17:47 字數 1308 閱讀 6971

今天是端午節,祝大家端午節快樂。今年的疫情讓很多人放棄了出行的計畫,宅在家裡,我也是無聊,想到寫點什麼東西和大家分享下,希望有感興趣的看看,如果有什麼想法歡迎交流。

生產者和消費者是軟體世界裡很尋常的場景,然而大多數程式設計師平時寫**不會用到,因為很多系統都是用來查詢資料展示資料,寫寫crud就好了。隨著mq的橫空出世,讓大家都醉心於這種好用的中介軟體,配置乙個topic,傳送訊息就呼叫客戶端的傳送介面,接收訊息繼承乙個介面,寫乙個listener,整個從生產到消費全流程就這種友好的解決了,效能和完整性更不用你擔心,因為這些主流mq都號稱是幾十萬的tps,4個9的可靠性。

凡事需知其然及其所以然,mq就是乙個基於生產者和消費者的最佳實踐。今天想基於阻塞佇列來實現生產者和消費者的場景,阻塞佇列用的是arrayblockingqueue,乙個生產者執行緒,乙個消費者執行緒。

生產者**

public class producer implements runnable 

public void run() catch (interruptedexception e) }}

}

消費者**

public class consumer implements runnable 

public consumer(string name, blockingqueuequeue)

public void run() catch (interruptedexception e) }}

}

下面建立了乙個生產者和二個消費者,因為生產者生產得快,大家可以先用乙個消費者看看結果,會發現消費佇列總會有元素,主要源於生產者生產的速度比消費者快,當增加乙個消費者後,就會發現隊列為空,被消費完了,執行緒等待的狀況。

public class consumertest  catch (interruptedexception e) 

}}

如果佇列滿了,對於arrayblockingqueue 的 offer操作來說,會直接丟棄掉插入的元素。如果想驗證,可以將佇列容量修改為4,然後在生產者中加入下面的**,就會打出插入失敗的元素,並且往後看,會發現這個元素不會被消費到。

public void run()  catch (interruptedexception e) 

}}

今天和大家聊了下生產者和消費者,相信大家已經大致明白了整個的過程,為大家模擬了單生產者多消費者的例子,大家也可以自己去擴充套件多生產者和多消費者。說到這裡,還是想拋磚引玉,這個佇列例子和mq佇列相比有哪些不足,mq有哪些黑科技為大型分布式系統保駕護航。

濃濃新華情 溫暖大家庭

前幾天,無意中看見新華部落格首頁推薦的一首意境哀傷的詩歌 如果,我選擇了遠方 一股莫名的心酸湧上心頭.後來方知新華旭曦患胰腺癌正在 的訊息,當時很是揪心和心痛!旭曦的病,牽動著新華版主和們的心,大家紛紛以不同的方式,表達自己對旭曦的關愛和慰問,許多為此寫下了一篇篇感人至深的文字。而在 新華部落格大家...

JS基礎之自增自減

自增要麼是 a 要麼是 a,但是區別很大 a 就是自增前的值,換句話就是先使用再進行加1運算。例 var a 10 a console.log a 結果 10 console.log a 結果 11 原因是第一次輸出時已經使用a了,所以第二次輸出就是在原基礎上加1再輸出。var c 10 c 第一次...

軟體工程McCabe環路複雜度計算,自環情況詳解。

1 流圖中的區域數等於環形複雜度。2 流圖g的環形複雜度v g e n 2,其中,e是流圖中邊的條數,n是結點數。3 流圖g的環形複雜度v g p 1,其中,p是流圖中判定結點的數目。推薦使用方法三,是萬能的。不用考慮自環是否涉及到程式。這裡就通過網上流傳的最多的例子,也是具有代表性的例子來說明 方...