2014-02-25 59 views
1

我有一個方法來解析txt文件並將數據保存到數據庫。 命名方法:parseFileAndSaveToDB(String fileAddress); 這個文件很大(100 000行),因此將數據插入數據庫非常長。Java解析txt文件多線程

任何人都可以幫助我在多線程中做到這一點? 我覺得每個線程都可以使用此方法forexample每個文件:

parseFileAndSaveToDB("c:/file1");//thread 1 
parseFileAndSaveToDB("c:/file2");//thread 2 
parseFileAndSaveToDB("c:/file3");//thread 3 
parseFileAndSaveToDB("c:/file4");//thread 4 

但如何用多線程做?這是個好主意嗎?

+0

你有嘗試過什麼嗎? –

+1

我們可以幫助您改進或糾正您的代碼/邏輯。我們不是在這裏爲你寫代碼。 –

+0

他們在同一張桌子上書寫嗎?如果是的話,多線程根本沒有用處。 – Smutje

回答

1

這是快速草稿。作爲應該讀取和存儲的文件名的程序傳遞列表的參數。

public class ParsingThread implements Runnable{ 
private String fileName; 

public ParsingThread(String fName){ 
    fileName = fName; 
} 

@Override 
public void run(){ 
    parseFileAndSaveToDB(fileName); 

} 
public void parseFileAndSaveToDB(String fileName){ 
    //your implementation 
} 



public static void main(String args[]){ 
    for(String fileName : args){ 
     Thread runAndStore = new Thread(new ParsingThread(fileName)); 
     runAndStore.run(); 
    } 

    } 
} 
+0

他不允許我在main方法和for循環中使用這個線程,IDE說我必須使用ParsingThread,但如果我使用這個,那麼我必須在ParsingThread方法中創建方法start() – hetmanJIIIS

+0

現在它應該工作我編輯我的代碼錯誤。 – RMachnik

0

非常基本的模板:

public static void parseFileAndSaveToDB(String filePath) 
{ 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // # TODO : Open file with path "filePath" 
      // # Read file 
      // # Write to database 
     } 
    }).start(); 
} 

public static void main(String args[]) { 
    List<String> paths; // # TODO : fill this list with the file paths you have 

    for(String filePath : paths) 
    { 
     parseFileAndSaveToDB(filePath); 
    } 
} 

但在這之前,我強烈建議你的多線程在java中的consecpt讀一些快速舉報通道。您可能會發現以下源有幫助:

2

請看一看這個link here,解釋如何在Java中使用的ExecutorService。它可以是這樣的:

ExecutorService executorService = Executors.newFixedThreadPool(10); 

MyDataLoader myDataLoader1 = new MyDataLoader("c:/file1"); 
MyDataLoader myDataLoader2 = new MyDataLoader("c:/file2"); 
MyDataLoader myDataLoader3 = new MyDataLoader("c:/file3"); 

executorService.execute(myDataLoader1); 
executorService.execute(myDataLoader2); 
executorService.execute(myDataLoader3); 

executorService.shutdown(); 

您可以編寫MyDataLoader類,如:

public class MyDataLoader implements Runnable { 

    String fileName = null; 

    public MyDataLoader(String fileName) { 
     this.fileName = fileName; 
    } 

    public void run() { 
     //Your logic to parse file and insert the data in DB. 
    } 
} 

希望這有助於。

-1

因爲我不能添加評論,所以我會添加一個答案。我同意Rafik991的回答,在實現中,您可以通過計算您擁有的行數開始,以便在您的線程之間平均分配數據。檢查這個link快速實現。我不確定這是否是一個好主意,因爲您將通過該文件獲得正確的內容,但我認爲這就是您要做的。