更好的并行循环方式

时间:2019-10-09 08:26:02

标签: java java-8

如果我想并行处理此代码:

try {
    for (int i = 0; i < 10000; i++) {
        new File(String.valueOf(i)).createNewFile();
    }
} catch (IOException e) {
    e.printStackTrace();
}

然后将其重写为:

ArrayList<String> fileNames = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
    fileNames.add(String.valueOf(i));
}
fileNames.parallelStream().forEach(i -> new File(i).createNewFile());

但是有没有更好(更简单)的方法呢?

3 个答案:

答案 0 :(得分:3)

一个独特的非答案:

  

如果我想并行处理此代码:

然后(很可能)您需要转向完全不同的硬件/软件堆栈,以从中获得任何好处。

您会看到,除非我们在谈论某种“远程”文件系统,否则可以通过多个“路径”(实际上是)访问该文件系统,并且该文件系统实际上类似于多个IO设备。 ..您进行优化的尝试毫无意义

并行处理包括很多正在等待不同事情的活动是有意义的。但就您而言,您的代码使用一个文件系统与一个操作系统进行对话。最有可能的是,您的想法甚至使事情变慢了。

答案 1 :(得分:1)

IntStream中尝试parallel()

IntStream.range(0, 10000).parallel().forEach(i -> {
    try {
        new File(String.valueOf(i)).createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }
});

但是由于磁盘操作,效率不会很高。

答案 2 :(得分:0)

只是为了另一种可能性。

fileNames.parallelStream().map(Path::Files.createFile).collect(Collectors.toList());
fileNames.stream().map(path -> Files.createFile(path)).collect(...

weenween返回一个列表,其中包含对象Path。

相关问题