zbb20181009 多執行緒程式設計 阻塞 併發佇列

2022-05-30 10:57:07 字數 3020 閱讀 8307

最近,一直在跟設計的任務排程模組周旋,目前終於完成了第一階段的除錯。今天,我想借助平台把最近在設計過程中,使用佇列和集合的一些基礎知識給大家總結一下,方便大家以後直接copy。本文都是一些沒有技術含量的東西,只是做個總結,牛哥還請繞路。

老習慣,還是先跟各位紙上談會兒兵,首先說說佇列,他主要分為併發佇列和阻塞佇列,在多執行緒業務場景中使用最為普遍,我就主要結合我所做過的業務談談我對它們的看法,關於它們的api和官方解釋就不提了。

併發佇列:最常見的業務場景就是多個執行緒共享同乙個佇列中的所有資源,就拿我們公司的業務場景來說,當使用者通過多個渠道下單後,然後就會有多個不同的客戶端通道同時去獲取訂單並處理訂單,為了加快訂單處理速度我們使用併發佇列來充當任務源頭,為了加快處理訂單速度,結合多執行緒併發來滿足需求。

併發佇列沒什麼可說的,就是乙個簡單的多執行緒程式設計操作,小demo送給各位:

/*

* * 併發佇列concurrentlinkedqueue的使用 */

public

class

concurrentqueue }/*

* * 任務** */

class

mq string tasklist = "

jf1gh78f18g036149,jf1sh95f6ag110830,jf1sj94d7dg010387,jf1sh92f9cg269249,jf1sh92f5bg215090,jf1sh92f5bg222556,jf1sh92f4cg279994,jf1br96d7cg114298,jf1br96d0bg078632,jf1sh95f9ag094011,jf1sh98fxag186997,jf1bm92d8bg022510,jf1bm92dxag013855,jf1bm94d8eg036618";

string split = tasklist.split(","

); list

task = arrays.aslist(split); //

陣列轉集合

queue.addall(task); //

按照集合中元素的順序將集合中全部元素放進佇列

return

queue;

}}/*

* * 製單客戶端 */

class

toyotayq implements runnable

system.

out.println(thread.currentthread().getname() + "

成功製單:

" + thisvin + "

。剩餘:

" + queueyq.size() + "

個任務"

); }}}

}

阻塞佇列:最常見的業務場景就是生產者不斷生產任務放進阻塞佇列中,消費者不斷從阻塞佇列中獲取任務;當阻塞佇列中填滿資料時,所有生產者端的執行緒自動阻塞,當阻塞佇列中資料為空時,所有消費端的執行緒自動阻塞。這些操作blockingqueue都已經包辦了,不用我們程式設計師去操心了。

阻塞佇列我們常用的有:linkedblockingqueuearrayblockingqueue,它們在各方面還是很大的區別的;arrayblockingqueue在put,take操作使用了同乙個鎖,兩者操作不能同時進行,而linkedblockingqueue使用了不同的鎖,put操作和take操作可同時進行,以此來提高整個佇列的併發效能。

作為開發者,使用阻塞佇列需要注意的一點是:如果構造乙個linkedblockingqueue物件,而沒有指定其容量大小,linkedblockingqueue會預設乙個類似無限大小的容量(integer.max_value),這樣的話,如果生產者的速度一旦大於消費者的速度,也許還沒有等到佇列滿阻塞產生,系統記憶體就有可能已被消耗殆盡了。

下面是我根據這幾天設計的任務排程功能模擬的乙個小demo,只不過專案中使用了mq服務,這裡用阻塞佇列完成可以代替:

public

class

blockqueuedemo }/*

* * 生產者 */

class

producerdemo implements runnable

@override

public

void

run() catch

(interruptedexception e) }}

}class

consumerdemo implements runnable

@override

public

void

run() catch

(interruptedexception e) }}

}

開發中各位最常用最熟悉的不過也是集合了,但是前幾天在設計中突然想自己控制任務的分配和修改,這就需要用到靈活操作集合中的內容了,其它也沒什麼,但是刪除集合中的元素這一點我們還是必須要很熟練的,雖然是需要借助迭代器來刪除的,但是還是記錄一下吧,方便以後copy。

刪除list集合中的某元素:

public

class

listdemo ;

arrlist.addall(arrays.aslist(arr));

//將陣列轉成集合

//刪除前:

for(string thisitem:arrlist)

system.

out.println("

#########################");

//使用迭代器刪除集合中的元素

iterator it =arrlist.iterator();

while(it.hasnext())

}//刪除後:

for(string thisitem:arrlist)}}

多執行緒併發程式設計

docker 可謂是開啟了容器化技術的新時代,現在無論大中小公司基本上都對容器化技術有不同程度的嘗試,或是已經進行了大量容器化的改造。伴隨著 kubernetes 和 cloud native 等技術和理念的普及,也大大增加了業務容器化需求。而這一切的推進,不可避免的技術之一便是構建容器映象。在本場...

多執行緒併發程式設計

程序是乙個執行的程式,程序裡面有多個執行緒,執行緒是程序中負責執行的程式的一執行單元,執行緒本身是依靠程式進行執行的,執行緒是程式中乙個順序控制流。執行緒分為單執行緒和多執行緒。多執行緒能更好利用cpu資源。以前單程序的,時間片切換 多執行緒實現方式 繼承thread,實現runnable。exec...

併發程式設計 多執行緒

目錄程序是作業系統可以排程已經進行資源分配的基本單位,是乙個資源單位,其中包含了執行這個程式所需的資源 特點 系統會為每乙個程序自動建立一條執行緒,稱之為主線程,後續通過 開啟的執行緒稱之為子執行緒 計算機是乙個工廠,程序就是乙個車間,執行緒就是車間內的流水線 item 程序執行緒 單位資源單位 執...