??看消息中間件的時(shí)候浦徊,涉及到延時(shí)消息的場景丙者,在一篇文章中提到了Java中的DelayQueue也可以實(shí)現(xiàn)延時(shí)隊(duì)列的效果哥纫,研究一下扎唾。
1.
基礎(chǔ)信息
1)一個(gè)泛型類召川,最早出現(xiàn)版本在JDK5,屬于java.util.concurrent包下胸遇,直接繼承了AbstractQueue<E>類荧呐,直接實(shí)現(xiàn)BlockingQueue<E>接口。
2)泛型對象對應(yīng)的類要實(shí)現(xiàn)接口Delayed才可以纸镊。
3)一個(gè)空參構(gòu)成倍阐,一個(gè)有參構(gòu)造,17個(gè)public方法可用逗威,看起來也不是很難懂收捣。
4)因?yàn)殚g接實(shí)現(xiàn)了Collection接口,所以它也是集合下的一員庵楷,屬于Queue這個(gè)系列下的實(shí)現(xiàn)類,集合的一些方法它也可以用楣颠。
5)使用put和offer方法都可以向隊(duì)列中放入數(shù)據(jù)尽纽,看了下源碼,put方法也是調(diào)用offer方法童漩,在offer方法中使用了lock鎖弄贿,所以這里的操作是線程安全的。最終使用的是類PriorityQueue中的offer方法矫膨,底層最終使用數(shù)組來存放對象差凹。所以可以說這個(gè)類的底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組。
2.
看起來不復(fù)雜侧馅,參考了幾篇文章危尿,確實(shí)可以在生產(chǎn)者-消費(fèi)者的場景下去使用。生產(chǎn)者把對象放到隊(duì)列中馁痴,消費(fèi)者從中取出即可谊娇,通過設(shè)置過期時(shí)間,可以達(dá)到延時(shí)的效果罗晕,但里面好像有很多需要注意的地方济欢,這個(gè)在以后使用時(shí)再細(xì)致看吧。
3.
來看一個(gè)簡單的使用案例小渊。
1)首先準(zhǔn)備放入隊(duì)列的對象法褥,需要實(shí)現(xiàn)接口Delayed,并且重寫getDelay和compareTo方法酬屉,對于compareTo方法要格外注意半等,操作不當(dāng),可能會(huì)造成隊(duì)列中的對象數(shù)據(jù)排序錯(cuò)亂,導(dǎo)致延時(shí)的效果失效酱鸭。
2)創(chuàng)建一個(gè)生產(chǎn)者吗垮,沒什么套路,就是用線程定期創(chuàng)建A對象
3)創(chuàng)建一個(gè)消費(fèi)者凹髓,也是線程烁登,跟生產(chǎn)者交替操作,便于演示
4)然后就是調(diào)用線程演示就可以了蔚舀,正常情況下饵沧,會(huì)生產(chǎn)一個(gè),消費(fèi)一個(gè)這樣赌躺。
使用確實(shí)不難狼牺,但看了好幾篇文章,都說要格外注意很多細(xì)節(jié)礼患,在這不一一列出了是钥,本文算是一個(gè)普及操作,知道這是個(gè)啥東西缅叠,大概能干啥悄泥,算是對MQ的一個(gè)小擴(kuò)展了解,所以不做深究了肤粱。
有什么好想法弹囚,可以留言哦~
參考文章:
java中DelayQueue的使用
https://www.cnblogs.com/flydean/p/java-delayqueue.html