Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从一个输入流中读取两个线程?_Java_Multithreading_Inputstream - Fatal编程技术网

Java 如何从一个输入流中读取两个线程?

Java 如何从一个输入流中读取两个线程?,java,multithreading,inputstream,Java,Multithreading,Inputstream,我有一个定期接收数据的输入流。我的一个线程(我们称之为threadA)读取流中的每一条消息,并确保数据是正确的,但如果不是这样,它将通过一个错误。我的另一个线程(我们称之为threadB)需要读取一些特定的消息,然后进行处理。到目前为止,我已经让threadA将重要消息存储在全局变量中,threadB从全局变量读取消息 有没有办法允许两个线程从同一个源读取以避免这种情况 编辑:输入的数据是对threadB发出的命令的响应。我的问题是threadB需要来自某些命令的回复,这些命令不是以特定模式发出

我有一个定期接收数据的输入流。我的一个线程(我们称之为threadA)读取流中的每一条消息,并确保数据是正确的,但如果不是这样,它将通过一个错误。我的另一个线程(我们称之为threadB)需要读取一些特定的消息,然后进行处理。到目前为止,我已经让threadA将重要消息存储在全局变量中,threadB从全局变量读取消息

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


编辑:输入的数据是对threadB发出的命令的响应。我的问题是threadB需要来自某些命令的回复,这些命令不是以特定模式发出的,但它不需要所有回复。

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


我建议您保留基本设置,但尽量消除全局变量,例如,通过使用obverser模式,将对共享存储的引用传递给线程等。

听起来似乎不需要两个线程。第一个只是一个过滤器。在一个线程中进行过滤和处理。或者,让第一个线程将数据过滤到第二个线程读取的第二个流中。问题是threadB只需要一些回复。所以,如果我让它阅读每一个回复,那么有时它会坐在那里浪费时间等待它甚至不需要的回复。@alex然后让它只在需要回复时才等待回复。很抱歉我的无知,但我对Java有点陌生。要读入,我有一个扫描仪,并执行
if(in.hasNextLine()){doSomething(in.nextLine());}
。如果我在需要回复时运行此代码,它是否会提供我尚未阅读的最旧消息?因此,如果我发送一条不需要回复的消息,那么就发送一条需要回复的消息。我不想先看第一条留言的回复吗?如果这不合理,请告诉我。两个线程很可能以不同的速度读取,因为一个是指定的读卡器,另一个需要同时读取和执行其他进程。不幸的是,对于即将到来的消息,没有可预测的模式(请参见编辑)。还有消除全局变量的方法吗?@alex,如我所说,为消息存储创建一个适当的线程安全结构(例如使用基于类型的队列),并将对该存储的引用传递给线程(例如在构造函数中)。然后让阅读器线程将消息放入存储,处理器从存储中取出消息。