搜尋

首頁  >  問答  >  主體

java 有没有一种有固定大小的并发队列,在有新的数据插入的队尾的时候自动poll掉队头的元素?

java 有没有一种有固定大小的并发队列,在有新的元素插入的队尾的时候能自动判断如果队列满了就poll掉队头的元素,没满就offer进去?

ps:考虑过LinkedBlockingQueue和ConcurrentLinkedQueue

ConcurrentLinkedQueue可以用size()判断大小
LinkedBlockingQueue可以用offer()判断,如果塞不进去说明队列满了

但是效率都不太高(在判断队列是否满了的情况。。。)
而且由于E元素是业务bean,比较大,所以100并发时候大概到了300~400ms。。。。

求大神更优的解决方案。。。

PHP中文网PHP中文网2816 天前693

全部回覆(3)我來回復

  • ringa_lee

    ringa_lee2017-04-17 11:48:08

    1. 為什麼100並發需要全部集中在這個Queue裡面了?似乎設計有點問題
    2. 解決方法:RingBuffer. 具體自行wikipedia.效率極高

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 11:48:08

    ArrayBlockingQueue 應該符合 LZ 的要求,但還是需要自己根據 offer 的回傳值來判斷。

    ConcurrentLinkedQueue 的 size 不是常數時間操作,所以慢。 LinkedBlockingQueue 用鍊錶實現的,而且也不是專門用於固定大小的隊列,所以也慢。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 11:48:08

    簡單一點的,ArrayBlockingQueue

    複雜一點的,特別是讀線程遠大於寫線程的,用LMAX的RingBuffer

    LinkedQueue慢是慢在每次插入刪除元素都有四次指標操作,如果你大小固定,用array是最好的方法。

    回覆
    0
  • 取消回覆