Ho una raccolta di elementi che desidero elaborare in parallelo. Quando utilizzo uno List
, il parallelismo funziona. Tuttavia, quando utilizzo uno Set
, non viene eseguito in parallelo.Lo streaming parallelo da un HashSet non viene eseguito in parallelo
Ho scritto un esempio di codice che mostra il problema:
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);
}
Questo è l'output che ottengo su Windows 7
set print
start: 1
end: 1
start: 2
end: 2
list print
start: 2
start: 1
end: 1
end: 2
Possiamo vedere che il primo elemento dal Set
doveva terminare prima che il secondo elemento venga elaborato. Per List
, il secondo elemento inizia prima che il primo elemento termini.
Puoi dirmi che cosa causa questo problema e come evitarlo usando una collezione Set
?
prova con più di due elementi, come 10. elementi o qualcosa.i risultati con 2 sono troppo vaghi – nafas
Quando provi con 10 non riesci ancora a mettere in parallelo tutti gli elementi impostati. E ho bisogno di eseguire tutti gli elementi in parallelo. – Nemo
Qualsiasi modo questo è l'uscita per 10 (con pool di 10 esecutori) elementi di stampa inizio: 8 inizio: 0 inizio: 4 inizio: 6 inizio: 2 fine: 2 fine: 6 fine: 4 fine: 0 inizio: 1 fine: 8 inizio: 9 inizio: 5 inizio: 7 inizio: 3 fine: 3 fine: 5 fine: 9 fine: 7 fine: 1 lista di stampa inizio: 7 inizio: 3 inizio: 0 inizio: 6 inizio: 9 inizio: 8 inizio: 5 inizio: 4 inizio: 2 inizio: 1 fine: 0 fine: 6 fine: 7 fine: 9 fine: 2 fine: 3 fine: 8 fine: 5 fine: 1 fine: 4 Non tutti gli elementi fissi corrono in parallelo – Nemo