java - Spring Boot 异步读取10个文件

标签 java asynchronous spring-boot

下面的代码显示我一次读取一个文件夹中的一个文件。我想一次读取 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,例如 AsynchronousFileChannelRxIo简化了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()

下图显示了对应于“同步,两个控制线程”的已接受答案提案与对应于“异步”的我的提案之间的差异

eloquent javascript

关于java - Spring Boot 异步读取10个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810089/

相关文章:

java - 在双向多对多关系中有效获取子/父实体

java - Java 反射 getMethod 有时不起作用的原因是什么?

java - 如何将 JPanel 中的 TextFields 中输入的值添加到数组中?

javascript - 如何使用 Spring Boot Controller 将 javascript 变量保存到我的 sql 中?

java - NoSuchMethodError : javax. 验证.BootstrapConfiguration.getClockProvider

typescript - 类型 'awaited T' 的参数不可分配给类型 'T' 的参数

java - 为自定义查询实现 ViewModel 和 Repository

单元测试 spring 服务类中的 java.lang.NullPointerException

javascript - 如何从异步调用返回响应?

python - 使用 Python 请求的异步请求