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

按参数排序的Java多线程

按参数排序的Java多线程,java,multithreading,Java,Multithreading,网络协议解析器代码,在单线程中解析下面的层。在解析一些procotol之后,获得唯一的对话框id。 用于网络协议解析器项目;有一个消息解析器,解析具有多个层(例如以太网、ip、tcp等)的消息。解析字段之一是位于层中间的对话框id;这意味着在获取它之前需要进行一些解析操作。获取对话框id后,解析操作应该(因为性能)多线程约束是指具有相同对话框id的消息应按相同顺序处理。我有一些想法,但不确定是否优雅 创建10个队列作为对话框id的最后一位,每个队列解析单独的线程 关于对话框id的modula操作

网络协议解析器代码,在单线程中解析下面的层。在解析一些procotol之后,获得唯一的对话框id。 用于网络协议解析器项目;有一个消息解析器,解析具有多个层(例如以太网、ip、tcp等)的消息。解析字段之一是位于层中间的对话框id;这意味着在获取它之前需要进行一些解析操作。获取对话框id后,解析操作应该(因为性能)多线程约束是指具有相同对话框id的消息应按相同顺序处理。我有一些想法,但不确定是否优雅

  • 创建10个队列作为对话框id的最后一位,每个队列解析单独的线程
  • 关于对话框id的modula操作的多个执行器类似于第一个选项 如何以多线程方式处理消息

    更多的解释; 同一对话框id有多条消息,它应该处理相同的顺序。对话框id之间没有相关性,我的意思是对话框id=100可以在对话框id=99之前处理

    消息的传入顺序示例

  • 对话框id=100
  • 对话框id=99
  • 对话框id=98
  • 对话框id=100
  • 对话框id=100
  • 对话框id=98
  • 对话框id=99

  • 消息4应在消息1之后的消息5之前处理。消息4-消息2或消息4-消息3等之间没有任何顺序。

    您需要跟踪当前正在处理的任何消息的对话框ID,因为在前一个对话框ID完成之前,您无法开始处理具有相同对话框ID的另一个消息

    因此我建议如下:将数据包存储在列表列表中。主列表包含每个对话框ID的一个条目,其中至少有一条未处理的消息。内部列表包含该对话框ID当前未处理(或未完全处理)的所有消息

    收到新消息时:检查当前正在处理的消息表。如果有一个对话框ID相同,请将此消息链接到其后面。如果没有,请使用此对话框ID在表中创建一个新条目。将其标记为已准备好处理并唤醒任何休眠线程


    要处理消息:请检查当前正在处理的消息表。如果没有标记为就绪的,则等待一个标记为就绪。如果您发现一个标记为就绪,则从该内部列表中获取标题消息,并将该列表标记为正在处理中。完成处理后,如果没有链接到它的消息(使用相同的对话框ID0),请将其从主列表中删除。否则,请删除我们已处理的消息并将其标记为准备处理。

    好的,考虑到您对问题的评论中所做的编辑和我的假设,我可能会执行以下操作(我认为这与您的建议非常接近)。请注意,我假设处理的顺序很重要,但不是生成任何结果的顺序(因此,您需要在每个有效负载项上使用序列id)

    我建议如下:

  • 使用基于队列的机制来确保 具有相同对话框id的项。这可以是并发 队列实现或JMS队列,具体取决于分布 你的系统
  • 根据总负载,确定所需的队列数量
  • 具有相同dialogId的所有项目必须转到同一队列。多个 不同的DialogID可以进入同一队列
  • 使用哈希标识应将dialogId分配给哪个队列 或id的模。这样,您的队列将始终包含 为dialogId排序的有效负载项
  • 要么:

    (a) 从每个队列挂起多个工作线程以同时处理项目, 按队列的顺序。这提供了最高的并发性(在 (硬件的限制),但您确实要冒两件相同的物品的风险 按顺序启动但按顺序完成的对话框id(即1001_1启动 首先,但睡眠和1001_2启动并在该时间内完成)

    (b) 在每个队列上仅挂起一个工作线程,以便在中处理该队列中的项目 严格的顺序是一次一个。现在您可以将每个队列的线程数减少到 只有一个队列,但这样做可以保证该队列的处理顺序 (以及在其上处理的所有DialogID)

    (c) 如(b)所示,但每个对话框id有一个线程(对于该队列上处理的所有id 它可以向前看,并且只能处理具有该id的线程 订购并提高吞吐量(即更多线程)

    (d) As(a)具有多个线程,这些线程跨所有id运行,但将锁定对话框id 确保处理按顺序完成。在管理要做的事情时会产生大量开销 对话框id锁定时-启动新队列?重新排队


  • 在任何情况下,每个队列都可以至少有一个线程,并且队列的数量可以根据您的设置进行优化。这样可以实现一些并发性。此外,您可以在队列中分布越多的对话框ID,效果越好。其他要考虑的是队列的负载平衡。

    我想最后一点才是真正的问题所在您会问:“在所有具有相同对话框id的项目都按顺序处理的情况下,配置我的有效负载的最佳方法是什么?”根据定义,“不具有相同对话框id的项目可以按任何顺序处理”-即,项目dialogId=1001可以与dialogId=1002的项目同时处理?如果上述情况属实,则:(1)我假设“按顺序”的意思是,一旦解析器识别出一个有效负载项,它必须在解析器识别出的下一个具有相同对话框id的项之前进行处理。例如,对于dialogId=1001,解析器会先查找项1001_1,然后查找项1001_2,然后查找项1001_3,因此这些项应该按该顺序进行处理。如果是这样,(2)每个项目的处理结果保持在该顺序是很重要的,还是t