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原因如钽所说。我认为代码可以在您的计算机上运行,因为您读取的文件很小。这样就可以得到一个结果。