Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过多线程获取时保证文件内容的顺序_Java_Multithreading - Fatal编程技术网

Java 通过多线程获取时保证文件内容的顺序

Java 通过多线程获取时保证文件内容的顺序,java,multithreading,Java,Multithreading,假设有100个文件编号为1-100,您需要使用多线程并行读取这些文件。有没有办法按1-100的顺序打印这些文件的内容?有,前提是您可以将所有文件的内容保存在内存中 基本思想是继续存储未来到您将按顺序完成文件的读取/处理,然后按创建顺序从未来获取值 List<String> filePathsInOrder = new ArrayList<>(); List<Future<String>> fileOutputsInO

假设有100个文件编号为1-100,您需要使用多线程并行读取这些文件。有没有办法按1-100的顺序打印这些文件的内容?

有,前提是您可以将所有文件的内容保存在内存中

基本思想是继续存储
未来
到您将按顺序完成文件的读取/处理,然后
按创建顺序从未来获取值

        List<String> filePathsInOrder = new ArrayList<>();
        List<Future<String>> fileOutputsInOrder = new ArrayList<>();
        for (String filePath : filePathsInOrder) {
            fileOutputsInOrder.add(CompletableFuture.supplyAsync(() -> {
                try {
                    return Files.readString(Paths.get(filePath));
                }
                catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }));
        }
        for (Future<String> fileOutput : fileOutputsInOrder){
            System.out.println(fileOutput.get());
        }
List filePathsInOrder=new ArrayList();
List fileoutputsinoorder=new ArrayList();
for(字符串文件路径:filePathsInOrder){
fileOutputsInOrder.add(CompletableFuture.SupplySync)(()->{
试一试{
返回Files.readString(path.get(filePath));
}
捕获(IOE异常){
抛出新的运行时异常(e);
}
}));
}
用于(未来文件输出:文件输出顺序){
System.out.println(fileOutput.get());
}

当然,您需要采取一些微妙的措施,如在读取失败的情况下进行异常处理等。这在上面已经做了,因为这超出了本问题的范围。

当然可以。您可以创建一个包含100个元素的
字符串
数组,并填充适当索引的元素,因此,如果您读取文件55,则可以将第54个
字符串
(请记住,索引从0开始)设置为它。如果等待所有线程完成,则可以循环此数组并打印其内容。你也可以决定不等待。在这种情况下,您可以有一个数字n值(初始化为-1),表示最后一个成功打印的文件,在每个线程结束时,您可以打印出此时可以打印的文件。

如果要连续打印输出,为什么要同时读取内容?看起来您应该一次读取一个文件,从1到100的数字顺序,然后以这种方式打印输出。在这里引入一致性(从你的问题文本来看)似乎没有必要。我的一位朋友在采访中被问到这个问题,因此很想知道这是否可以实现。