存储和转发的线程安全集合

时间:2017-01-28 05:40:45

标签: java collections concurrency

以下是我们必须制定的情况 我们会有一大堆id被一个作家连续插入到一个集合中。 目的是提醒客户注意这些特殊的ID 为此,计划线程将遍历此集合,整理ID,然后将“重置”集合清空。
我打算使用ConcurrentLinkedQueue。
虽然这会使它成为线程安全的;但是有可能“重置”清除一些尚未被警告的ID。
什么是最好的方法呢?

3 个答案:

答案 0 :(得分:0)

您的collat​​or线程应该在处理队列时从队列中删除每个条目。如果您这样做,则无需重置队列,也不会出现通知丢失的问题。

(如果这对你没有意义,很可能是你没有明确解释的东西。尝试添加一些示例代码......)

答案 1 :(得分:0)

重置'的可能性清除一些ID只是问题,所以你可以做的是:

在计划线程中,

首先获取该特定队列中存在的当前大小/没有ID 本地变量中的时间" 大小"因为它会随着新元素的插入而改变。 然后迭代ConcurrentLinkedQueue直到 size , 迭代从ConcurrentLinkedQueue中删除/轮询元素以收集ID。

这样您就不需要重置ConcurrentLinkedQueue。

答案 2 :(得分: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;
    }
}