2017-07-24 52 views
0

在我的應用程序數據生成速度(它是存儲在concurrentLinkedQueue)大於我可以消耗單線程。如何在多線程上迭代concurrentLinkedQueue?

我決定先創建4個線程來使用數據,以防止我的應用程序出現「內存不足異常」。

問題:

  • 用於與例如上述問題的任何其他更好的設計?
  • 我們可以迭代concurrentLinkedQueue和多個線程,並在迭代時刪除元素嗎?

內存一致性效果:當存在其他併發集合,事先將對象放入到該元素的在接入 或去除從所述的ConcurrentLinkedQueue之後的 的ConcurrentLinkedQueue發生-前行動在一個線程 動作另一個 線程。

+0

我想看看[阻塞隊列(HTTPS:/ /docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html),因爲您的消費者線程可能不得不在處理「生產者」時處理這種情況。然後你可以通過發送一些特殊的項目給他們停止線程(4份,所以每個線程將消耗一個) – tevemadar

+0

@tevemadar感謝您的建議:) –

回答

0

我想你不應該重複,但是從隊列創建4個線程每個輪詢數據,以便調查數據將被刪除或者換句話說消耗

// your queue 
ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue(); 

    // create 4 Threads 
    for (int i = 0; i < 4; i++) { 
     new Thread(() -> { 
      while (true) { 
       // consume element 
       concurrentLinkedQueue.poll(); 

       // do something with element 
       // here 
      } 
     }).start(); 
    } 
0

您應該使用一個ConcurrentLinkedQueueofferpoll方法,而不是直接使用迭代器。迭代器是weakly consistent

while(true) { 
    final Item item = queue.poll(); 
    if (item == null) { 
    break; 
    } 
    // do something with item 
} 

它是安全的多個線程調用offer和/或poll兼任。

+0

感謝您的答案:), –