Parallel stream von einem HashSet nicht parallel laufen

Habe ich Sammlung von Elementen, die möchte ich parallel verarbeiten. Wenn ich mit einem List, Parallelität funktioniert. Jedoch, wenn ich mit einem Set es nicht parallel laufen lassen.

Schrieb ich ein Codebeispiel, das veranschaulicht das problem:

public static void main(String[] args) {
    ParallelTest test = new ParallelTest();

    List<Integer> list = Arrays.asList(1,2);
    Set<Integer> set = new HashSet<>(list);

    ForkJoinPool forkJoinPool = new ForkJoinPool(4);

    System.out.println("set print");
    try {
        forkJoinPool.submit(() ->
            set.parallelStream().forEach(test::print)
        ).get();
    } catch (Exception e) {
        return;
    }

    System.out.println("\n\nlist print");
    try {
        forkJoinPool.submit(() ->
            list.parallelStream().forEach(test::print)
        ).get();
    } catch (Exception e) {
        return;
    }   
}

private void print(int i){
    System.out.println("start: " + i);
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
    }
    System.out.println("end: " + i);
}

Dies ist die Ausgabe, die ich auf windows 7

set print
start: 1
end: 1
start: 2
end: 2

list print
start: 2
start: 1
end: 1
end: 2

Können wir sehen, dass das erste element aus der Set hatte, zu beenden, bevor das zweite element verarbeitet. Für die List, das zweite element beginnt, bevor das erste element beendet.

Können Sie mir sagen, was dieses Problem verursacht und wie man es vermeiden mit einem Set Sammlung?

  • versuchen Sie es mit mehr als zwei Elementen, wie 10. Elemente oder so etwas. die Ergebnisse mit 2 ist zu vage
  • Wenn Sie versuchen mit 10 Sie nicht immer noch parallel alle set-Elemente. Und ich muss alle Elemente parallel.
  • Jeder Weg, dies ist der Ausgang für 10 (mit Schwimmbad von 10 Vollzieher) Elemente festlegen drucken start: 8 gestartet: 0 gestartet: 4 start: 6 Beginn: 2 Ende: 2 end: 6 end: 4 end: 0 start: 1 Ende: 8 start: 9 start: 5 start: 7 start: 3 Ende: 3 end: 5 Ende: 9 end: 7: 1 Liste drucken start: 7 start: 3 start: 0 start: 6 start: 9 start: 8 start: 5 start: 4 start: 2 start: 1 end: 0 end: 6 Ende: 7 Ende: 9 Ende: 2 end: 3 end: 8-Ende: 5: 1 end: 4 Nicht alle set-Elemente parallel laufen
InformationsquelleAutor Nemo | 2015-03-11
Schreibe einen Kommentar