在Java中,是否存在一个具有`BlockingQueue.drainTo`之类的功能的HashSet?

时间:2018-11-27 13:17:03

标签: java queue hashset

我想要一种将HashSet的内容复制到集合中,同时又不阻止新插入内容的方法。

BlockingQueuedrainTo方法中具有此功能。

如何使用HashSet来做到这一点?谢谢。

*我愿意使用ConcurrentHashMap.newKeySet()之类的“并发HashSet”结构。

1 个答案:

答案 0 :(得分:1)

这样的方法怎么样:

public <T> int drainTo(Set<? extends T> source, Collection<T> target) {
    Iterator<? extends T> it = source.iterator();
    int count = 0;
    while (it.hasNext()) {
        target.add(it.next());
        it.remove();
        count++;
    }
    return count;
}

public static void main(String[] args) throws Exception {
    Collection<String> list = new ArrayList<>();

    // HashSet<String> set = new HashSet<>();
    Set<String> set = ConcurrentHashMap.newKeySet();
    set.add("1");
    set.add("2");
    set.add("3");

    new Thread(() -> {
        set.add("4");
        set.add("5");
    }).start();

    drainTo(set, list);

    // could print [1, 2, 3] , [1, 2, 3, 4], or [1, 2, 3, 4, 5]
    // since there's no guarantee that the thread finished putting all elements in yet 
    System.out.println(list);
}