Есть ли в Java HashSet с такой функциональностью, как `BlockingQueue.drainTo`? - PullRequest
0 голосов
/ 27 ноября 2018

Я бы хотел скопировать содержимое HashSet в коллекцию, не блокируя новые вставки.

BlockingQueue имеет эту функцию в drainTo method.

Как это сделать с HashSet?Спасибо.

* Я открыт для использования "параллельных структур HashSet", таких как ConcurrentHashMap.newKeySet().

1 Ответ

0 голосов
/ 27 ноября 2018

Как насчет такого метода:

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);
}
...