【发布时间】:2015-06-12 22:15:15
【问题描述】:
我创建了一个自定义 ForkJoinPool,并行度为 25。
customForkJoinPool = new ForkJoinPool(25);
我有一个包含 700 个文件名的列表,我使用这样的代码从 S3 并行下载文件并将它们转换为 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);
});
});
当我查看日志时,我看到只使用了 5 个线程。并行度为 25,我预计这将使用 25 个线程。下载文件并将其转换为对象的平均延迟约为 200 毫秒。我错过了什么?
可能更好的问题是并行流如何计算在为其创建线程之前将原始列表拆分多少?在这种情况下,它似乎决定将其拆分 5 次并停止。
【问题讨论】:
-
这个问题不适合 fork-join。对于初学者,您需要使用
ManagedBlocker,因为您的任务是阻塞的。但是,由于它是 I/O,并且不能递归整除,因此仍然不太合适。
标签: java multithreading java-8 java-stream fork-join