下面的代码显示我一次读取一个文件夹中的一个文件。我想一次读取 10 个文件,运行 METHOD_A 并写入另一个文件夹。文件夹中有5000个文件。一次读取文件 1 的速度非常慢。我想加快速度。
我正在使用 Java Spring Boot。有什么建议我可以这样做吗?
for (int i = 0; i < files.length; i++){
Object obj = parser.parse(new FileReader(files[i]));
JSONObject obj1 = METHOD_A(obj);
try{
PrintWriter writer = new PrintWriter(...);
writer.println(obj1);
writer.close();
} catch (IOException e) {
// do something
}
}
提前谢谢您。
最佳答案
对于 CPU 密集型工作,应考虑管理线程和任务,但这不是您的情况。对于输入/输出,您应该使用非阻塞 IO,例如 AsynchronousFileChannel
。 RxIo简化了AFC的使用,您可以通过AsyncFiles
来实现您的目标API,如:
AsyncFiles
.readAll(files[i])
.thenApply(parser::parse)
.thenApply(obj -> obj.toString().getBytes())
.thenCompose(bytes -> AsyncFiles.writeBytes(..., bytes))
.thenAccept(index -> /* invoked on completion */)
.exceptionally(excep -> /* invoked on error*/
通常要管理异步 IO,您应该使用非阻塞 IO,这可以避免显式管理线程池和阻塞线程。由于接受的答案建议是阻塞线程来获取结果,因此您将在 newFixedThreadPool(size)
中配置多少个线程来实现并发?
也许,线程池大小可以等于正在读取的文件数。你的情况可能是 10 个?
但是在 WorkerThread
提案中,您在读取和解析时阻塞了线程。我不知道 parser
的类型,但由于您给它一个阻塞的 FileReader
那么 parser.parse(…)
将阻塞当然。最后,您将再次阻塞 writer.println()
。
下图显示了对应于“同步,两个控制线程”的已接受答案提案与对应于“异步”的我的提案之间的差异
关于java - Spring Boot 异步读取10个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810089/