2016-09-29 49 views
0

我正嘗試同步我的過程,但I`ve得到關於它的質疑同步閱讀。我只有一個輸入文件可以讀取。我正在考慮將讀取方法同步到線程。相反,在創建線程之前,如何將文件讀取到數組中,然後將數組除以線程數目,您會怎麼看?每個線程只能使用這個數組的範圍。陣列範圍或輸入文件

非常感謝大家。

+0

Could'you張貼一些代碼。 –

+0

嗨!編寫代碼之前這是一個想法。這個想法是一個從輸入文件處理單個uid並將其插入到數據庫中的線程。當我創建線程時,我不知道是否在將輸入文件放入數組後,爲每個線程或線程進程同步讀取輸入文件後獲取數組範圍。你怎麼看?謝謝! –

+0

您只需要從文件中插入數據庫uid。這個文件很大,你需要多線程? –

回答

0

爲了提高性能,我可以建議你一些方法:

  • 如果它是該文件的內容的簡單的插入,你可以使用LOAD DATA INFILE(MySQL的字)或批量插入(甲骨文字) ,也許你需要在一個線程中創建另一個文件。

  • 您可以將文件拆分爲1000或10000行(示例),並使用多線程使用線程池處理文件以管理線程號https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

  • 讀取文件中的一個線程和線程池使用(也許更簡單)給插入操作到另一個線程。

  • 使用一個ETL做到這一點。
0

相反,你認爲怎麼樣創建線程,然後線程數除以陣列之前文件讀入到一個數組?每個線程只能使用這個數組的範圍。

是的,我認爲,這使得很多更有意義。通常,當我嘗試處理來自文件的條目時,我有一個線程正在讀取文件,然後排隊等待線程池執行的作業。然後我可以分配一些處理線程,從文件獲取條目並通過ExecutorService處理它們。取決於實施方式,從BlockingQueue出列也是可能的。

在半碼,這將是這個樣子:

// file reader 
ExecutorService threadPool = Executors.newFixedThreadPool(NUM_WORKERS); 
while (true) { 
    line = file.readLine(); 
    if (line == null) { 
     break; 
    } 
    threadPool.submit(new MyRunnable(line)); 
} 
// shutdown the pool after we submit the last line 
threadPool.shutdown(); 
... 

// multiple thread processors 
public class MyRunnable implements Runnable { 
    private final String line; 
    public MyRunnable(String line) { 
     this.line = line; 
    } 
    public void run() { 
     processLine(line); 
    } 
} 

你的線程用於訪問文件的戰鬥相反,隔離閱讀到一個線程和處理給了別人。