非阻塞CSV读取

时间:2018-05-06 11:42:21

标签: java

我们的代码使用 BufferedReader 在线程中读取CSV。例如,如果要上传五个CSV,则将打开五个线程,读取不同的CSV文件并使用自己的 BufferedReader 。最近我们注意到,当六次上传同时运行时,CSV读数在进一步调查中变得缓慢,我们发现

  

CSV未同时读取。

当一个线程读完一行后,其他线程开始读取CSV行。

  

每次CSV时,CSV读数按顺序发生   上传是在独立线程中运行而不是共享BufferedReader或   相同的CSV文件。

class CSVUplod extends Thread{
    private String fileName;
    private String filePath;

    @Override
    public void run() {
        try{
            csvUploadFn();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public CSVUpload(String fileName , String filePath){
        this.fileName = fileName;
        this.filePath = filePath;
        Thread T = new Thread(this);
        T.start();  
    }


private boolean csvUploadFn(){
    try {
        BufferedReader bf = new BufferedReader(new FileReader(new File(filePath+fileName)));
        String csvLine = bf.readLine();
        do {
        //read line and add into DB
            csvLine = bf.readLine();
        } while(csvLine!=null);
    } catch(Exception ex) {
        ex.printStackTrace();
    } 
    return true;
    }   
}

那么任何建议应该是什么问题。感谢

1 个答案:

答案 0 :(得分:0)

你在构造函数中启动你的线程,而它没有完全初始化。这将导致意外行为。

public CSVUpload(String fileName , String filePath){
    this.fileName = fileName;
    this.filePath = filePath;
    Thread T = new Thread(this); // `this` is not fully constructed yet
    T.start();  
}

在构造函数外部启动线程,看看是否修复了问题。

public CSVUpload(String fileName , String filePath){
    this.fileName = fileName;
    this.filePath = filePath;
}

在课外:

CsvUpload csvUploader = new CsvUpload("", "");
csvUploader.start();