2017-01-28 53 views
0

以下是我們需要開發的情況。
我們將會有一羣ids通過一位作者不斷插入集合中。 意圖是提醒客戶有關這些特定的ID。
爲此,計劃線程將穿過此集合,整理ID並在此後將該集合「重置」爲空。
我打算爲此使用ConcurrentLinkedQueue。
儘管這會使其線程安全;但有可能「重置」清除尚未提醒的某些ID。
什麼是最好的方式去做這件事?用於存儲和轉發的線程安全集合

回答

0

您的整理程序線程應在處理它時從隊列中移除每個條目。如果這樣做,則不需要重置隊列,並且不會出現丟失通知的問題。

(如果這沒有意義的你,有你沒有明確解釋最有可能的事情。嘗試添加一些示例代碼......)的「復位」清除掉一些IDS是

0

可能性只有這個問題,所以那是你可以做的是:

附表線程,

首先得到當前大小/沒有在那個特定 時間出現在隊列ID的一個局部變量「 尺寸「,因爲它會隨着插入新元素而改變。 然後迭代ConcurrentLinkedQueue,直到大小爲, ,同時迭代從ConcurrentLinkedQueue中刪除/輪詢元素以收集ID。

以這種方式,您不需要重置ConcurrentLinkedQueue。

0

你可以保持這個越簡單,越會出錯。

我會創建一個容器來管理你的ID集合,只公開你需要的兩個操作。

您的寫入線程需要將條目添加到集合中,並且您的日程安排線程需要批量提取它們。複製讀取策略只需要幾行:

import java.util.ArrayList; 
import java.util.List; 

public class IdList<T> { 
    private ArrayList<T> entries = new ArrayList<>(); 

    /** 
    * Add a notification ID to the collection. 
    */ 
    public synchronized void add(T entry) { 
     entries.add(entry); 
    } 

    /** 
    * Remove the next batch of notification IDs from the collection. 
    */ 
    public synchronized List<T> drain() { 
     ArrayList<T> current = entries; 
     entries = new ArrayList<>(); 
     return current; 
    } 
}