【问题标题】:Multi-Thread BufferedReader for reading .txt用于读取 .txt 的多线程 BufferedReader
【发布时间】:2015-07-22 00:37:57
【问题描述】:

我想阅读 .txt 的行来完成任务,然后继续下一行。

为了让程序更快,我想多线程,所以每个线程都尝试一行。

问题是,我不希望线程 1 尝试与线程 2 相同的行。

有什么想法吗?

【问题讨论】:

  • 让每个线程跳过x行,x为线程数;或者只使用共享的Scanner/FileReader/StringReader 并调用nextLine() 或类似名称。确保在每次读取一行时锁定 Scanner,以免同时遇到两次读取访问。
  • 有点跑题了:为什么你认为做这个多线程会更快?
  • 您的代码将受 I/O 限制,而不是 CPU 限制,因此多线程不会提高性能。

标签: java multithreading bufferedreader


【解决方案1】:

我建议您让 一个 线程完成所有读取,然后将这些行放入生产者/消费者队列(例如 LinkedBlockingQueue) - 然后您可以让多个线程作为消费者服务该队列.

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

【讨论】:

    【解决方案2】:

    您可以在一个线程中读取行并为每一行调度一个工作线程:

    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();
       }
    }
    

    【讨论】:

      【解决方案3】:

      我对您要实现的目标有所了解,但不确定您将如何编写代码。 如果您可以使每个线程在不同的行上工作,那么线程将不会发生冲突。 我的意思是让 thread1 从 1 读取到 100,thread2 从 101 读取到 200,依此类推。 最后加入所有线程的结果以获得最终结果。 也许是 Fork/Join 操作。

      但@Jon 的评论让我对采用这种方法持谨慎态度。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-04
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 2017-05-30
        • 2015-10-22
        相关资源
        最近更新 更多