数组范围或输入文件的同步读数

时间:2016-09-29 09:11:34

标签: java arrays multithreading

我正在尝试同步我的流程,但我对此表示怀疑。我只有一个输入文件可供阅读。我在考虑将read方法与线程同步。相反,您如何看待在创建线程之前将文件读入数组,然后将数组除以线程数?每个线程只能使用一系列此数组。

非常感谢大家。

2 个答案:

答案 0 :(得分:0)

为了提高性能,我可以提出一些建议:

  • 如果只是简单插入文件的内容,你可以使用LOAD DATA INFILE(mysql word)或批量插入(oracle words),也许你需要在这个文件中创建另一个文件线程。

  • 您可以将文件拆分1000或10000行(示例)并使用多线程来处理使用线程池的文件来管理线程号https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

  • 在一个线程中读取文件,并使用threadpool将插入操作提供给另一个线程(可能更简单)。

  • 使用ETL执行此操作。

答案 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);
    }
}

您可以将读取隔离到一个线程并将处理隔离到其他线程,而不是您的线程争取访问该文件。