最近,一直在跟設計的任務排程模組周旋,目前終於完成了第一階段的除錯。今天,我想借助平台把最近在設計過程中,使用佇列和集合的一些基礎知識給大家總結一下,方便大家以後直接copy。本文都是一些沒有技術含量的東西,只是做個總結,牛哥還請繞路。
老習慣,還是先跟各位紙上談會兒兵,首先說說佇列,他主要分為併發佇列和阻塞佇列,在多執行緒業務場景中使用最為普遍,我就主要結合我所做過的業務談談我對它們的看法,關於它們的api和官方解釋就不提了。
併發佇列:最常見的業務場景就是多個執行緒共享同乙個佇列中的所有資源,就拿我們公司的業務場景來說,當使用者通過多個渠道下單後,然後就會有多個不同的客戶端通道同時去獲取訂單並處理訂單,為了加快訂單處理速度我們使用併發佇列來充當任務源頭,為了加快處理訂單速度,結合多執行緒併發來滿足需求。
併發佇列沒什麼可說的,就是乙個簡單的多執行緒程式設計操作,小demo送給各位:
/*阻塞佇列:最常見的業務場景就是生產者不斷生產任務放進阻塞佇列中,消費者不斷從阻塞佇列中獲取任務;當阻塞佇列中填滿資料時,所有生產者端的執行緒自動阻塞,當阻塞佇列中資料為空時,所有消費端的執行緒自動阻塞。這些操作blockingqueue都已經包辦了,不用我們程式設計師去操心了。* * 併發佇列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() + "
個任務"
); }}}
}
阻塞佇列我們常用的有:linkedblockingqueue和arrayblockingqueue,它們在各方面還是很大的區別的;arrayblockingqueue在put,take操作使用了同乙個鎖,兩者操作不能同時進行,而linkedblockingqueue使用了不同的鎖,put操作和take操作可同時進行,以此來提高整個佇列的併發效能。
作為開發者,使用阻塞佇列需要注意的一點是:如果構造乙個linkedblockingqueue物件,而沒有指定其容量大小,linkedblockingqueue會預設乙個類似無限大小的容量(integer.max_value),這樣的話,如果生產者的速度一旦大於消費者的速度,也許還沒有等到佇列滿阻塞產生,系統記憶體就有可能已被消耗殆盡了。
下面是我根據這幾天設計的任務排程功能模擬的乙個小demo,只不過專案中使用了mq服務,這裡用阻塞佇列完成可以代替:
public開發中各位最常用最熟悉的不過也是集合了,但是前幾天在設計中突然想自己控制任務的分配和修改,這就需要用到靈活操作集合中的內容了,其它也沒什麼,但是刪除集合中的元素這一點我們還是必須要很熟練的,雖然是需要借助迭代器來刪除的,但是還是記錄一下吧,方便以後copy。class
blockqueuedemo }/*
* * 生產者 */
class
producerdemo implements runnable
@override
public
void
run() catch
(interruptedexception e) }}
}class
consumerdemo implements runnable
@override
public
void
run() catch
(interruptedexception e) }}
}
刪除list集合中的某元素:
publicclass
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 程序執行緒 單位資源單位 執...