Java 使用并行性逐行处理文本文件,但保留顺序

Java 使用并行性逐行处理文本文件,但保留顺序,java,Java,我需要逐行处理纯文本文件的内容 因为处理每一行都需要一些耗时的处理(访问外部资源),所以我希望同时执行它 我可以用ThreadPoolExecutor轻松地做到这一点,但问题是我需要编写保持输入顺序的输出(即使我知道从CPU使用的角度来看这不是最佳的) 另一个限制是输入文件可能很大,因此不能将其全部保存在内存中的某种结构中 有什么想法吗 您可以使用典型的生产者-消费者模式 1) 读取输入文件并创建工作块的线程。这个块可以有一行来自文件,或者为了效率(取决于用例)可以有多行。每个块都有一个单调递增

我需要逐行处理纯文本文件的内容

因为处理每一行都需要一些耗时的处理(访问外部资源),所以我希望同时执行它

我可以用ThreadPoolExecutor轻松地做到这一点,但问题是我需要编写保持输入顺序的输出(即使我知道从CPU使用的角度来看这不是最佳的)

另一个限制是输入文件可能很大,因此不能将其全部保存在内存中的某种结构中


有什么想法吗

您可以使用典型的生产者-消费者模式

1) 读取输入文件并创建工作块的线程。这个块可以有一行来自文件,或者为了效率(取决于用例)可以有多行。每个块都有一个单调递增的升序id

2) 线程池处理在上述步骤中创建/提交的任务块。处理结果将写入优先级队列(根据订单id排序)

3) 线程从这个优先级队列中读取-这个步骤还需要维护它读取的最后一个任务的计数器。因此,如果队列的头是3,并且最后一个任务的序列是1,那么它需要等待任务2到达


同样,也可以使用回调以事件驱动的方式实现。在步骤3中会有一些内存需求;例如,事件到达时间为1、3、4、2。所以3和4需要保存在内存中,直到块2的结果到达。

谢谢!这是我尝试的第一个实现,但我不是很满意,因为从队列中拉出正确的块有点棘手,而且不是一个非常干净的设计。我想知道是否有一个更干净的模式来解决这个问题。