如何使用java中的线程实现这个文本文件读/写程序?

时间:2018-06-11 16:07:17

标签: java multithreading jdbc

我有一个包含1300000行的文本文件。我编写了用于将其导入mysql数据库的java代码。在java类中,我有一个名为textloadutility()的方法,它是从jsp页面调用的。可以有人给出这个java程序的异步线程实现。

package Snomed;
import catalog.Root;
import java.io.*;
import java.sql.PreparedStatement;
import org.json.JSONObject;

public class Textfileimport {


    public String textloadutility() throws Exception {

        Root oRoot = null;

        PreparedStatement oPrStmt = null;

        FileReader in = null;

        BufferedReader br=null;

        final int batchSize = 1000;

        int count = 0;

        JSONObject oJson = null;



        String str=null;

        oJson = new JSONObject();

         oJson.put("status","failure");

         str=oJson.toString();


        try {


             oRoot = Root.createDbConnection(null);




             String sql = "INSERT INTO textfiledata (col1,col2,col3,col4,col5,col6,col7,col8,col9) VALUES( ?, ?, ?,?,?,?,?,?,?)";

             oPrStmt = oRoot.con.prepareStatement(sql);

            in = new FileReader("C:/Users/i2cdev001/Desktop/snomedinfo_data.txt");      

            br = new BufferedReader(in);

            String strLine;

            while ((strLine = br.readLine()) != null){

                String [] splitSt =strLine.split("\\t");
                String dat1="",dat2="",dat3="",dat4="",dat5="",dat6="",dat7="",dat8="",dat9="";
                dat1=splitSt[0];
                dat2=splitSt[1];
                dat3=splitSt[2];
                dat4=splitSt[3];
                dat5=splitSt[4];
                dat6=splitSt[5];
                dat7=splitSt[6];
                dat8=splitSt[7];
                dat9=splitSt[8];        




                oPrStmt.setString(1, dat1);
                oPrStmt.setString(2, dat2);
                oPrStmt.setString(3, dat3);
                oPrStmt.setString(4, dat4);  
                oPrStmt.setString(5, dat5);
                oPrStmt.setString(6, dat6);
                oPrStmt.setString(7, dat7);
                oPrStmt.setString(8, dat8);
                oPrStmt.setString(9, dat9);
                oPrStmt.addBatch();

                if (++count % batchSize == 0) {
                    oPrStmt.executeBatch();
                    oPrStmt.clearBatch(); 
                   }                
            }

            oPrStmt.executeBatch();

             oJson.put("status","sucess");

             str=oJson.toString(); 

             in.close();
                br.close();



            System.out.println("sucessfully imported");

        }
        catch (Exception e) {


            oJson.put("status","failure");

             str=oJson.toString(); 
            e.printStackTrace();
            System.err.println("Error: " + e.getMessage());

        } finally {
            oPrStmt = Root.EcwClosePreparedStatement(oPrStmt);

            oRoot = Root.closeDbConnection(null, oRoot);
        }
        return str;
    }

}

1 个答案:

答案 0 :(得分:0)

以下是您的问题的解决方案,

  1. 文件IO不应该是异步的,所以首先Thread-1应该批量读取文件并将其放入某个共享队列。
  2. 另一个多线程线程应该读取队列的内容并将其推送到db。您可以使用Java并发包的ExecutorService类来实现它。并使用CountDown latch协调所有这些线程。
  3. 一旦线程从文件中读取所有行,那么它将返回给调用者。
  4. 处理完所有这些队列条目后,数据库处理线程将被关闭,相应的倒计时锁存器也将减少并在移动到0后结束。
  5. 您应该使用对实际调用者的未来响应,以便在完成所有这些线程后,您将获得响应。
  6. 这是高级别的观点。