wait方法和BlockingQueue?
1.wait/notify是Object提供的native方法,可以用來(lái)線程之間的通信。
wait/notify結(jié)合synchronized可以實(shí)現(xiàn)一個(gè)線程安全的消息隊(duì)列。
2、BlockingQueuee
BlockingQueue是JDK提供的線程安全的消息隊(duì)列,對(duì)增加、刪除、獲取提供了四種的操作:
1、阻塞(put、take)
2、拋異常(add,remove)
3、阻塞等待超時(shí)(offer,poll)
4、返回特殊值(offer,poll)
BlockingQueue是個(gè)接口,JDK也提供了相應(yīng)的實(shí)現(xiàn),實(shí)現(xiàn)中主要使用Lock和Condition,Condition有await和signal方法,類(lèi)似wait和notify方法。
想要了解Lock的機(jī)制或者自己要實(shí)現(xiàn)一個(gè)鎖,就得了解
AQS(AbstractQueuedSynchronizer)是什么了,Lock的具體實(shí)現(xiàn)
ReentrantLock,ReadLock, WriteLock都是基于
AQS實(shí)現(xiàn)的,這里暫時(shí)不說(shuō)AQS了,說(shuō)下 BlockingQueue具體的幾個(gè)實(shí)現(xiàn):
1、ArrayBlockingQueue:有界隊(duì)列,底層是數(shù)組
2、LinkedBlockingQueue:無(wú)界隊(duì)列,底層是個(gè)單向鏈表
3、 SynchronousQueue:同步隊(duì)列,不提供任何容器來(lái)存放數(shù)據(jù)
4、PriorityBlockingQueue:優(yōu)先級(jí)無(wú)界隊(duì)列,底層是二叉樹(shù)最小堆
5、DelayQueue:支持延時(shí)獲取元素的無(wú)界阻塞隊(duì)列。底層是使用 PriorityQueue來(lái)實(shí)現(xiàn)。
所以,wait/notify和BlockingQueue都可以實(shí)現(xiàn)消息隊(duì)列,解決生產(chǎn)者和消費(fèi)者的問(wèn)題。不過(guò)BlockingQueue的實(shí)現(xiàn)提供更多的功能。
希望對(duì)你有幫助,可以關(guān)注下我,后續(xù)會(huì)分享更多架構(gòu)和Java知識(shí),謝謝。