Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 在读取CSV文件后,将循环中的特定任务作为多线程处理_Java_Multithreading_Spring Boot - Fatal编程技术网

Java 在读取CSV文件后,将循环中的特定任务作为多线程处理

Java 在读取CSV文件后,将循环中的特定任务作为多线程处理,java,multithreading,spring-boot,Java,Multithreading,Spring Boot,我有一个解析CSV文件并将值保存到MySQL数据库的方法。在这里,我逐行遍历文件,并将其存储到DB中。有没有办法利用线程并行地读写行,以便快速执行 下面是我希望以多线程方式执行的代码 public String csvUpload(MultipartFile file){ try { BufferedReader br = new BufferedReader(new InputStreamReader(file.getInputStream())); S

我有一个解析CSV文件并将值保存到MySQL数据库的方法。在这里,我逐行遍历文件,并将其存储到DB中。有没有办法利用线程并行地读写行,以便快速执行

下面是我希望以多线程方式执行的代码

public String csvUpload(MultipartFile file){
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(file.getInputStream()));
        String line = "";
        int header = 0;
        while ((line = br.readLine()) != null) {
            // TO SKIP HEADER
            if(header == 0) {
                header++;  
                continue;
            }
            header++;
            //Use Comma As Separator
            String[] csvDataSet = line.split(",");
            /*
               Call a Validator Method to Validate Data.
                if no Errors then{
               mapping to Pojo
             }else{
              Mapping the errors into error-List
            }
           once the whole file is read, then 
           if error-List is empty
              call saveAll() and save data.
           else 
              save the Errors into Db.

       */

        }

    }catch(IOException ex) {
        ex.printStackTrace();
    }

    return "Success";
}
我需要像下面这样做,使用threads.com,以便快速执行

thread1 --> line 1-10
thread2 --> line 11-20
线程应该并行执行以下任务

Call Validator Method(){
                    if no Errors then{
                   mapping to Pojo
                 }else{
                  Mapping the errors into error-List
                }
}

一旦读取了整个文件,则 如果错误列表为空 调用saveAll()并保存数据。 其他的 将错误保存到数据库中


欢迎提出任何建议和更正。提前感谢。

避免逐行阅读的一种方法是使用Java 7 Files类,该类具有readAllLines方法。 之后,您可以将可调用的任务提交给ExecutorService,以使用多个线程将其插入DB

List<String> lines = Files.readAllLines(Paths.get(path), encoding);
List lines=Files.readAllLines(path.get(path),编码);

您可以使用两个线程和一个线程安全队列。第一个线程从文件中读取每一行,并将其推送到队列中。第二个线程等待将项目推送到队列,然后弹出项目并将其发送到DB。这只是一种方法。您还应该知道,在程序中引入多线程并不能保证性能的提高。由于此任务的处理速度很可能受到I/O(从文件读取/写入数据库)的限制,因此使其多线程化不太可能使其更快。如果从硬盘读取文件,速度可能会慢得多,因为多个线程将争夺对硬盘的访问权,使得磁盘必须在文件的各个部分之间跳转。顺便说一句,您无法真正并行读取文件,因为现在无法确定在到达字符之前每行的起始位置使用多个线程不一定会提高速度。理想情况下,您应该对代码进行概要分析,以查看哪些代码花费的时间最多
BufferedReader
是Java IO的一部分。您是否考虑过尝试JavaNIO?例如,class
java.nio.MappedByteBuffer