1

ハッシュマップには 2 つのキーと値のペアがあり、異なるスレッドによって並行して処理されることはありません。


import java.util.stream.Stream;
import java.util.Map;
import java.util.HashMap;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        map.put("b", 2);
        map.values().parallelStream()
              .peek(x -> System.out.println("processing "+x+" in "+Thread.currentThread()))
              .forEach(System.out::println);
    }
}

出力:

processing 1 in Thread[main,5,main]
1
processing 2 in Thread[main,5,main]
2

URL: https://ideone.com/Hkxkoz

ValueSpliterator は、HashMap の配列をサイズ 1 のスロットに分割しようとする必要があります。これは、2 つの要素を異なるスレッドで処理する必要があることを意味します。

ソース: https://www.codota.com/code/java/methods/java8.util.HMSpliterators $ValueSpliterator/%3Cinit%3E

でラップした後ArrayList、期待どおりに動作します。

        new ArrayList(map.values()).parallelStream()
              .peek(x -> System.out.println("processing "+x+" in "+Thread.currentThread()))
              .forEach(System.out::println);

出力:

processing 1 in Thread[ForkJoinPool.commonPool-worker-3,5,main]
1
processing 2 in Thread[main,5,main]
2
4

2 に答える 2