按参数排序的Java多线程
网络协议解析器代码,在单线程中解析下面的层。在解析一些procotol之后,获得唯一的对话框id。 用于网络协议解析器项目;有一个消息解析器,解析具有多个层(例如以太网、ip、tcp等)的消息。解析字段之一是位于层中间的对话框id;这意味着在获取它之前需要进行一些解析操作。获取对话框id后,解析操作应该(因为性能)多线程约束是指具有相同对话框id的消息应按相同顺序处理。我有一些想法,但不确定是否优雅按参数排序的Java多线程,java,multithreading,Java,Multithreading,网络协议解析器代码,在单线程中解析下面的层。在解析一些procotol之后,获得唯一的对话框id。 用于网络协议解析器项目;有一个消息解析器,解析具有多个层(例如以太网、ip、tcp等)的消息。解析字段之一是位于层中间的对话框id;这意味着在获取它之前需要进行一些解析操作。获取对话框id后,解析操作应该(因为性能)多线程约束是指具有相同对话框id的消息应按相同顺序处理。我有一些想法,但不确定是否优雅 创建10个队列作为对话框id的最后一位,每个队列解析单独的线程 关于对话框id的modula操作
消息4应在消息1之后的消息5之前处理。消息4-消息2或消息4-消息3等之间没有任何顺序。您需要跟踪当前正在处理的任何消息的对话框ID,因为在前一个对话框ID完成之前,您无法开始处理具有相同对话框ID的另一个消息 因此我建议如下:将数据包存储在列表列表中。主列表包含每个对话框ID的一个条目,其中至少有一条未处理的消息。内部列表包含该对话框ID当前未处理(或未完全处理)的所有消息 收到新消息时:检查当前正在处理的消息表。如果有一个对话框ID相同,请将此消息链接到其后面。如果没有,请使用此对话框ID在表中创建一个新条目。将其标记为已准备好处理并唤醒任何休眠线程
要处理消息:请检查当前正在处理的消息表。如果没有标记为就绪的,则等待一个标记为就绪。如果您发现一个标记为就绪,则从该内部列表中获取标题消息,并将该列表标记为正在处理中。完成处理后,如果没有链接到它的消息(使用相同的对话框ID0),请将其从主列表中删除。否则,请删除我们已处理的消息并将其标记为准备处理。好的,考虑到您对问题的评论中所做的编辑和我的假设,我可能会执行以下操作(我认为这与您的建议非常接近)。请注意,我假设处理的顺序很重要,但不是生成任何结果的顺序(因此,您需要在每个有效负载项上使用序列id) 我建议如下:
在任何情况下,每个队列都可以至少有一个线程,并且队列的数量可以根据您的设置进行优化。这样可以实现一些并发性。此外,您可以在队列中分布越多的对话框ID,效果越好。其他要考虑的是队列的负载平衡。我想最后一点才是真正的问题所在您会问:“在所有具有相同对话框id的项目都按顺序处理的情况下,配置我的有效负载的最佳方法是什么?”根据定义,“不具有相同对话框id的项目可以按任何顺序处理”-即,项目dialogId=1001可以与dialogId=1002的项目同时处理?如果上述情况属实,则:(1)我假设“按顺序”的意思是,一旦解析器识别出一个有效负载项,它必须在解析器识别出的下一个具有相同对话框id的项之前进行处理。例如,对于dialogId=1001,解析器会先查找项1001_1,然后查找项1001_2,然后查找项1001_3,因此这些项应该按该顺序进行处理。如果是这样,(2)每个项目的处理结果保持在该顺序是很重要的,还是t