Ho un ForkJoinPool personalizzato creato con il parallelismo di 25.Perché parallelStream non utilizza l'intero parallelismo disponibile?
customForkJoinPool = new ForkJoinPool(25);
Ho una lista di 700 nomi di file e ho usato il codice come questo per scaricare i file da S3 in parallelo e lanciare loro di oggetti Java:
customForkJoinPool.submit(() -> {
return fileNames
.parallelStream()
.map((fileName) -> {
Logger log = Logger.getLogger("ForkJoinTest");
long startTime = System.currentTimeMillis();
log.info("Starting job at Thread:" + Thread.currentThread().getName());
MyObject obj = readObjectFromS3(fileName);
long endTime = System.currentTimeMillis();
log.info("completed a job with Latency:" + (endTime - startTime));
return obj;
})
.collect(Collectors.toList);
});
});
Quando guardo i log, vedo solo 5 thread in uso. Con un parallelismo di 25, mi aspettavo che usasse 25 thread. La latenza media per scaricare e convertire il file in un oggetto è di circa 200 ms. Cosa mi manca?
Potrebbe essere una domanda migliore: come può un parallelismo vedere quanto dividere l'elenco originale prima di creare i thread per esso? In questo caso, sembra che abbia deciso di dividerlo 5 volte e fermarsi.
Questo problema è un male in forma per fork-join. Per i principianti, dovresti usare 'ManagedBlocker' dato che il tuo compito sta bloccando. Ma poiché è I/O e non è divisibile in modo ricorsivo, non è ancora una buona idea. – erickson