2015-05-11 66 views
0

我想要读取.txt的行来执行任务,然后转到下一行。用于读取.txt的多线程缓冲读取器

为了让程序更快,我想多线程,让每个线程尝试一条线。

的问题是,我不希望线程1试图在同一行线2

任何想法?

+0

让每个线程跳过* x *行,其中* x *是线程的数量;或者只是使用一个共享的'Scanner/FileReader/StringReader'并调用'nextLine()'或类似的。确保锁定每个'Scanner'当你读一行时,你不会同时遇到两次读取访问。 – GiantTree

+0

有点题外话:你为什么认为使这个多线程更快? – MadConan

+0

你的代码将被I/O绑定,而不是CPU所以多线程不会提高性能。 – Raedwald

回答

3

我建议你一个线程执行全部看完,然后把线变成生产者/消费者队列(例如LinkedBlockingQueue) - 那么你可以有多个线程维护该队列作为消费者。

你真的不希望多个线程在这里执行IO - 即使你有多个独立的BufferedReaders,如果你从传统磁盘读取,你不想最终在多个地方寻找。生产者/消费者队列相当简单地将读取与处理分开 - 并且更容易单独测试每个部分。

0

你可以阅读在一个线程的线条和派遣工作线程的每一行:

try (BufferedReader reader = new BufferedReader(new FileReader("my.txt"))) { 
    String line; 
    while ((line = reader.readLine()) != null) { 
    new Runnable() { 
     void run() { 
      // do stuff with line 
     } 
    }.run(); 
    } 
} 
0

我对你想什么来实现,但不知道你将如何编写它的想法。 如果你可以让每个线程在不同的线上工作,那么线程不会发生冲突。 我的意思是让thread1从1读到100,thread2从101读到200等等。 最后加入所有线程的结果以获得最终结果。 也许叉/联合操作。

但是@Jon评论让我不敢采取这样的做法。

“你真的不想多线程执行此IO - 即使你有多个独立的BufferedReaders,如果你从传统的磁盘读取你不希望最终在多个地方寻找..