隊(duì)列是一個(gè)先進(jìn)先出的的數(shù)據(jù)結(jié)構(gòu)
消息隊(duì)列是用來(lái)解決這樣的問(wèn)題的:將突發(fā)的大量請(qǐng)求轉(zhuǎn)換為服務(wù)器能夠處理的隊(duì)列請(qǐng)求。eg:在一個(gè)秒殺活動(dòng)中羡宙,服務(wù)器1秒可以處理100條請(qǐng)求。而在秒殺活動(dòng)開(kāi)啟時(shí)1秒進(jìn)來(lái)1000個(gè)請(qǐng)求并且持續(xù)10秒掐隐。這個(gè)時(shí)候就需要將這10000個(gè)請(qǐng)求放入消息隊(duì)列里面狗热,后端按照原來(lái)的能力處理,用100秒將隊(duì)列中的請(qǐng)求處理完畢虑省。這樣就不會(huì)導(dǎo)致宕機(jī)匿刮。
queue 在java1.5被引入,它和list 探颈、set一樣繼承自collection接口熟丸。其中LinkedList 實(shí)現(xiàn)Deque接口
未實(shí)現(xiàn)阻塞接口的:
LinkedList : 實(shí)現(xiàn)了Deque接口,受限的隊(duì)列
PriorityQueue : 優(yōu)先隊(duì)列伪节,本質(zhì)維護(hù)一個(gè)有序列表光羞。可自然排序亦可傳遞 comparator構(gòu)造函數(shù)實(shí)現(xiàn)自定義排序怀大。
ConcurrentLinkedQueue:基于鏈表 線程安全的隊(duì)列纱兑。增加刪除O(1) 查找O(n)-
實(shí)現(xiàn)阻塞接口的:
實(shí)現(xiàn)blockqueue接口的五個(gè)阻塞隊(duì)列,其特點(diǎn):線程阻塞時(shí)化借,不是直接添加或者刪除元素潜慎,而是等到有空間或者元素時(shí),才進(jìn)行操作。
ArrayBlockingQueue: 基于數(shù)組的有界隊(duì)列
LinkedBlockingQueue: 基于鏈表的無(wú)界隊(duì)列
ProiporityBlockingQueue:基于優(yōu)先次序的無(wú)界隊(duì)列
DelayQueue:基于時(shí)間優(yōu)先級(jí)的隊(duì)列
SynchronousQueue:內(nèi)部沒(méi)有容器的隊(duì)列 較特別 --其獨(dú)有的線程一一配對(duì)通信機(jī)制
一些基本操作方法:
add 添加一個(gè)元素 如果隊(duì)列已滿(mǎn) 拋出illegalabException異常
offer 添加一個(gè)元素并返回true 如果隊(duì)列已滿(mǎn) 則返回false
put 添加一個(gè)元素 如果隊(duì)列已滿(mǎn) 則阻塞
remove 刪除并返回隊(duì)列頭部元素 如果隊(duì)列為空 則拋出一個(gè)NoSuchElementException
poll 移除并返回隊(duì)列頭部元素 如果隊(duì)列為空 則返回null
take 刪除并返回隊(duì)列頭部元素 如果隊(duì)列為空 則阻塞
peek 返回隊(duì)列頭部元素 如果隊(duì)列為空 則返回null
element 返回隊(duì)列頭部元素 如果隊(duì)列為空 則拋出NoSuchElementException異常