【问题标题】:Java multi-thread application that reads a single file读取单个文件的 Java 多线程应用程序
【发布时间】:2011-12-28 21:40:21
【问题描述】:

我目前编写的程序使用 32 个线程并每个线程读取 1 个文件(因此 32 个 .txt 文件)。多线程与 CPU 速度无关,但是每秒对 BING 的 api 进行 32 次调用比进行 1 次要快得多。每个 .txt 文件都包含一个搜索查询列表。我创建了一个线程,它一次从文件中读取一行。是否可以创建所有 32 个线程并将它们指向单个 .txt 文件?

【问题讨论】:

  • 我正在解析大文本文件,我通常这样做:一个生产者正在执行 I/O 并将其放入队列中,然后尽可能多的消费者从队列中获取作业。在您的情况下,您的唯一生产者可以读取 txt 文件并将每行一个条目放入队列中。

标签: java multithreading


【解决方案1】:

使用生产者-消费者模式。只有一个线程读取文件并使用put() 将每一行/命令推送到ArrayBlockingQueue(线程安全读写)。

所有其他 32 个线程应通过调用 take() 从同一个队列对象中读取。如果队列为空,它们将阻塞,这很好。

此解决方案更好,因为磁盘本质上是单线程的,因此并发读取文件不会得到太多。

【讨论】:

  • 谢谢,这使得更改输入比拥有 32 个单独的文件容易得多。
【解决方案2】:

您可以同步处理文件的代码。每次写入打开的文件时,写入并关闭它。使用监视器实现,应该没问题。

也可以使用 java util logging,因为它是线程安全的。如果你实现了一个处理程序,那么日志记录 API 应该处理线程安全问题。

【讨论】:

  • 问题中不涉及写作,这与日志记录无关。
【解决方案3】:

这取决于这些线程是如何实现的。如果每个文件都有自己的读取器或输入流,那么并发读取可能不是什么大问题。除非操作系统上的 JVM 实现在打开输入流时隐式锁定文件并且不能跨流共享锁。

但老实说,你会做很多不必要的工作。最好将对文件的访问封装在一个单独的类中并将其实例传递给您的线程,然后让该类进行必要的并发处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多