我正在尝试同步我的流程,但我对此表示怀疑。我只有一个输入文件可供阅读。我在考虑将read方法与线程同步。相反,您如何看待在创建线程之前将文件读入数组,然后将数组除以线程数?每个线程只能使用一系列此数组。
非常感谢大家。
答案 0 :(得分:0)
为了提高性能,我可以提出一些建议:
如果只是简单插入文件的内容,你可以使用LOAD DATA INFILE(mysql word)或批量插入(oracle words),也许你需要在这个文件中创建另一个文件线程。
您可以将文件拆分1000或10000行(示例)并使用多线程来处理使用线程池的文件来管理线程号https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html。
在一个线程中读取文件,并使用threadpool将插入操作提供给另一个线程(可能更简单)。
答案 1 :(得分: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);
}
}
您可以将读取隔离到一个线程并将处理隔离到其他线程,而不是您的线程争取访问该文件。