【问题标题】:How can I get two threads to read from one inputStream?如何让两个线程从一个 inputStream 中读取?
【发布时间】:2016-06-23 12:56:44
【问题描述】:

我有一个定期接收数据的输入流。我的一个线程(我们称之为 threadA)从流中读取每条消息并确保数据正常,否则会出现错误。我的另一个线程(我们称之为 threadB)需要读取一些特定的消息,然后对其进行处理。到目前为止,我让 threadA 将重要消息存储在全局变量中,而 threadB 从全局变量中读取消息。

有没有办法让两个线程从同一个源读取以避免这种情况?

edit:传入的数据是对线程B发出的命令的响应。我的问题是 threadB 需要某些命令的回复,这些命令没有特定的模式发出,但它不需要所有的回复。

【问题讨论】:

  • 听起来不需要两个线程。第一个仅仅是一个过滤器。在一个线程中进行过滤和处理。或者,让第一个线程将数据过滤到由第二个线程读取的第二个流中。
  • 问题是threadB只需要一些回复。因此,如果我让它阅读每条回复,那么有时它会坐在那里浪费时间等待它甚至不需要的回复。
  • @alex 然后只在需要时等待回复。
  • 抱歉我的无知,但我对 Java 有点陌生。要阅读,我有一台扫描仪,然后执行if(in.hasNextLine()){doSomething(in.nextLine());}。如果我在需要回复时运行此代码,它不会为我提供我尚未阅读的最旧消息吗?因此,如果我发送一条不需要回复的消息,那么就发送一条需要回复的消息。我不会先阅读第一条消息的回复吗?如果这没有意义,请告诉我。

标签: java multithreading inputstream


【解决方案1】:

您可能可以创建一个线程安全的输入流或包装器,如果该流支持标记/重置,您还可以让两个流并行读取数据。但是,您必须处理一个线程比另一个线程读取速度更快的情况,从而使标记/重置无法使用或不得不跳过数据 - 涉及的内容太多了,我怀疑您是否愿意为这一切而烦恼。

我建议您保留基本设置,但尝试摆脱全局变量,例如通过使用观察者模式,将共享存储的引用传递给线程等。

【讨论】:

  • 两个线程很可能会以不同的速度读取,因为一个是指定的读取器,另一个需要同时读取和执行其他进程。不幸的是,即将到来的消息没有可预测的模式(见编辑)。还有办法消除全局变量吗?
  • @alex 正如我所说,为您的消息存储创建一个适当的线程安全结构(例如,使用基于类型的队列)并将对该存储的引用传递给您的线程(例如在构造函数中)。然后让您的阅读器线程将消息放入存储中,处理器从那里获取它们。
猜你喜欢
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2015-02-24
  • 1970-01-01
相关资源
最近更新 更多