Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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_Asynchronous_Outputstream - Fatal编程技术网

一旦内容可用,Java就从流中读取

一旦内容可用,Java就从流中读取,java,asynchronous,outputstream,Java,Asynchronous,Outputstream,我在大约4GB的数据集上实现了一个XMLSAX解析器。 我处理这个数据集并构建几个输出对象。 然后,这些对象必须作为迭代器发送到另一个服务。 开始时,我想完成解析,将对象存储在一个文件中,然后通过读取它在迭代器中检索它们。 我想知道如何异步执行此操作,即在迭代器的next()方法中,等待解析器提供新内容。 谢谢。您似乎有一个经典的制片人/消费者节目 解决此类问题的最简单方法是让生产者(即解析器,在其自己的线程中运行)、将读取的项目存储到BlockingQueue,并让咨询者(即服务,在其自己的线

我在大约4GB的数据集上实现了一个XMLSAX解析器。 我处理这个数据集并构建几个输出对象。 然后,这些对象必须作为迭代器发送到另一个服务。 开始时,我想完成解析,将对象存储在一个文件中,然后通过读取它在迭代器中检索它们。 我想知道如何异步执行此操作,即在迭代器的
next()
方法中,等待解析器提供新内容。
谢谢。

您似乎有一个经典的制片人/消费者节目

解决此类问题的最简单方法是让生产者(即解析器,在其自己的线程中运行)、将读取的项目存储到BlockingQueue,并让咨询者(即服务,在其自己的线程中运行)从该BlockingQueue中读取项目


要发出解析结束的信号,您可以使用特定对象并将其添加到队列中,或者更改共享对象的状态(以线程安全的方式),消费者在读取队列中的下一个项目之前检查该状态。

因此,如果我理解正确,您不需要在“下载和解析”之间设置管道服务和其他服务,并在解析后立即发送对象?感谢您的快速回答!好的,让我看看我是否理解得很好,所以当迭代器实例化时,我让解析器中的线程开始执行他的工作并构建那些对象。在线程中,我有一个BlockingQueue,其中存储了内容。我将在hasNext()处阻止调用方,并等待线程中是否有更多内容。是这样吗?还有什么建议吗?另一个问题:您认为哪种实现最好?不,我建议您忘记迭代器。使用BlockingQueue,对于消费者来说,它是一种阻塞迭代器:您调用它,它会阻塞,直到队列中有可用的项为止。对于您的用例,ArrayBlockingQueue可能是最好的选择:它确保在队列中有太多的项目等待处理时阻止生产者,确保不会耗尽内存。不幸的是,迭代器是消费者的接口,我无法控制,所以我只
take()
hasNext()中BlockingQueue中的元素,然后我在
next()
中检索它,对吗?实施情况如何?在您看来,哪一个最适合我的问题?您可以按照建议创建一个阻塞队列,然后实现一个迭代器,从阻塞队列中获取下一个元素。其余的将自动发生。