阿波羅的戰(zhàn)車
2018-10-03 10:19:37
一個(gè)線程往隊(duì)列里插東西,一個(gè)線程讀東西,當(dāng)隊(duì)列是空的時(shí)候總是輪空,發(fā)現(xiàn)占用了大量的 cpu ,通過 yeild 沒有改善,通過 sleep(1) 就好了,但是這樣影響性能。所以,我想換一個(gè)插入是總是直接成功,但是讀取是阻塞的隊(duì)列。java 里有沒有現(xiàn)成的?
2 回答

吃雞游戲
TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
現(xiàn)成的不知道有沒有,自己實(shí)現(xiàn)的話可以用信號量。
另外你目前sleep的實(shí)現(xiàn)方式應(yīng)該沒什么問題的,對效率的影響很有限。其實(shí)阻塞在底層實(shí)現(xiàn)是也是sleep的,只不過時(shí)間更短。

qq_遁去的一_1
TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
java.util.concurrent.LinkedBlockingQueue
?樓主可以直接使用這個(gè)隊(duì)列,是線程安全的。
queue.take()
?獲取數(shù)據(jù),如果當(dāng)前沒有數(shù)據(jù),則阻塞直到返回可用數(shù)據(jù)queue.poll()
?獲取數(shù)據(jù),如果當(dāng)前沒有數(shù)據(jù),返回null
queue.pool(timeout, TimeUnit)
?獲取數(shù)據(jù),如果沒有數(shù)據(jù),阻塞一定的時(shí)間后如果有數(shù)據(jù)直接返回,沒有則返回null
樓主這個(gè)是典型的生產(chǎn)者/消費(fèi)者模式
添加回答
舉報(bào)
0/150
提交
取消