Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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_File_Java 8 - Fatal编程技术网

Java 如何使用线程池读取多个文件?

Java 如何使用线程池读取多个文件?,java,multithreading,file,java-8,Java,Multithreading,File,Java 8,我想使用线程池读取多个文件,但失败了 @Test public void test2() throws IOException { String dir = "/tmp/acc2tid2999928854413665054"; int[] shardIds = new int[]{1, 2}; ExecutorService executorService = Executors.newFixedThreadPool(2); for (int id : shard

我想使用线程池读取多个文件,但失败了

@Test
public void test2() throws IOException {
    String dir = "/tmp/acc2tid2999928854413665054";
    int[] shardIds = new int[]{1, 2};
    ExecutorService executorService = Executors.newFixedThreadPool(2);
    for (int id : shardIds) {
        executorService.submit(() -> {
            try {
                System.out.println(Files.readAllLines(Paths.get(dir, String.valueOf(id)), Charset.forName("UTF-8")));
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}
上面是我写的一个简单的例子。它达不到我的目的

System.out.println(Files.readAllLines(
        Paths.get(dir, String.valueOf(id)), Charset.forName("UTF-8")));

该行将不会运行,并且没有警告。我不知道为什么?

您正在提交要执行的任务,然后在等待任务完成之前结束测试
ExecutorService::submit
将提交将来要执行的任务并立即返回。因此,for循环提交两个任务,然后结束,测试函数在任务完成之前返回

您可以尝试在for循环之后调用
ExecutorService::shutdown
,让执行者知道所有任务都已提交。然后使用
ExecutorService::wait termination
进行阻止,直到任务完成

例如:


@试验
public void test2()引发IOException{
String dir=“/tmp/acc2tid299928854413665054”;
int[]shardIds=新的int[]{1,2};
ExecutorService ExecutorService=Executors.newFixedThreadPool(2);
for(int-id:shardIds){
执行器服务。提交(
() -> {
试一试{
System.out.println(Files.readAllLines(path.get(dir,String.valueOf(id)),Charset.forName(“UTF-8”));
}捕获(IOE异常){
e、 printStackTrace();
}
});
}
executorService.shutdown();
executorService.awaitTermination(60,TimeUnit.SECONDS);//最多等待1分钟以完成任务
}

您得到的输出是什么?它在我的计算机上工作。你确定你的测试框架有效吗?您的计算机上有两个文件,分别是:“/tmp/acc2tid299928854413665054/1”和“/tmp/acc2tid299928854413665054/2”?@StephanHogenboom原因如钽所说。我认为代码可以在您的计算机上运行,因为您读取的文件很小。这样就可以得到一个结果。