用于在线程之间共享数据的通道

时间:2012-02-08 08:01:52

标签: java guava blockingqueue

我有一个要求,我需要读取文本文件然后转换它并将其写入其他文件。我希望以并行方式执行此操作,例如一个用于读取的线程,一个用于转换,另一个用于写入。
现在要在线程之间共享数据,我需要一些通道,我想为此使用BlockingQueue,但是如果可以的话,我想探索一些其他(更好的)替代方案。
番石榴有一个EventBus但不确定这是否适合这个要求。从性能的角度来看,还有哪些其他替代品可供选择,哪一种最佳。

1 个答案:

答案 0 :(得分:2)

除非您的转换步骤非常密集,否则这可能是浪费时间。

这样想。你在问什么?

你要的是什么

  • 接收传入的数据流
  • 将其复制到另一个帖子
  • 将该线程呈现为传入的数据流

哪种数据结构最能代表第3步的传入数据流? (提示:这是你开始使用的InputStream!)

前两个步骤增加了什么价值? “转换”线程可以从磁盘读取的速度与通过另一个线程从磁盘读取的速度一样快。在中间添加线程加速磁盘读取。

时,你会开始考虑添加另一个线程
  1. 你的问题可以很有用分成独立的工作(比方说,每个线程都在一大块文本上工作)
  2. 将问题分解为这些工作的成本显着小于,而不是添加额外线程和协调它们之间的开销(这很小,但不是免费的!)
  3. 这个问题需要的资源多于单个CPU所能提供的资源(一个线程可以让您访问更多的CPU资源,但在I / O吞吐量方面没有多少价值)。