我正在处理文本文档解析应用程序。
文档的设计如图
所示以下是解析的完成方式:
文档包含页面的ArrayList
每个页面都有 Map<float, List<Character>>
float
值包含字符位置的yaxis值,因此key
和字符包含其他信息。
解析是通过第三方库逐个字符完成的。如果需要更多信息,请添加评论。
现在解析时我创建了两个ExecutorService线程池,一个用于页面,一个用于填充map。
我最初创建了一个文档,并将每个页面传递给page parser
,作为ExecutorService
的可运行。然后将empty map
传递给文本解析器。
文本解析器检查map
是否具有键值
如果是,则将该字符添加到列表或新列表中。
这里的问题是,可以同时为所有页面完成此任务,以加快执行速度。但是我无法处理这个数据结构,因为如果正常解析并且使用Collections.synchronizedMap
以同步方式完成所有线程,则会花费很多时间。
另外,我维护两个不同的Future对象列表来检查线程是否完成。
请为改进和并发执行提供有价值的建议,以加快执行速度。
答案 0 :(得分:2)
如果每个页面都有自己的Map<float, List<Character>>
,那么永远不会有多个线程处理单个页面 - 那么您就不需要同步访问Map
或使用并发{{1实现。 JB Nizet在评论中建议,您可以在工作者之间对页面进行静态分区;另一种选择是将所有页面放在ConcurrentLinkedQueue中,并让工作人员Map
用于解析页面的队列,当队列为空时终止(poll
返回poll
) 。无论哪种方式,您只需要一个null
,因为每个工作人员都负责解析和映射填充。