[英]Array range or synchronized reading from input file
我正在嘗試同步我的過程,但對此有疑問。 我只有一個輸入文件可供讀取。 我正在考慮將read方法同步到線程。 相反,您如何看待在創建線程之前將文件讀入數組,然后將數組除以線程數呢? 每個線程只能使用此數組的范圍。
非常感謝大家。
為了提高性能,我可以建議您一些方法:
如果只是簡單地插入文件內容,則可以使用LOAD DATA INFILE(mysql字)或批量插入(oracle字),也許您需要在一個線程中從該文件創建另一個文件。
您可以將文件拆分為1000或10000行(示例),並使用多線程處理來使用線程池管理文件,以管理線程號https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html 。
在一個線程中讀取文件,然后使用線程池將插入操作提供給另一線程(也許更簡單)。
相反,您如何看待在創建線程之前將文件讀入數組,然后將數組除以線程數呢? 每個線程只能使用此數組的范圍。
是的,我認為這更有意義。 通常,當我嘗試處理文件中的條目時,我有一個線程正在從文件中讀取內容,然后將作業排隊以供線程池執行。 然后,我可以分配多個處理線程,這些線程從文件中獲取條目並通過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);
}
}
無需將線程爭奪訪問文件的權限,而是將讀取隔離到一個線程,將處理隔離到另一個線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.