多线程Java应用程序的设计模式

时间:2017-07-13 19:43:14

标签: java multithreading design-patterns

我有一个后端接收函数

的请求
update(by_whom, payload);

然后我处理请求,然后相应地回答。

每次用户发送请求时,消息都会在生成答案之前经过多个处理对象。

现在,我将如何在他自己的线程中处理每个用户?我不明白如何将事件分派给量身定制的线程。

示例:

User 1发送第一个请求 - >我们制作一个ThreadUser1并在那里处理它。

User 2发送第一个请求 - >我们创建一个ThreadUser2并在那里处理它,如果来自user1的request1没有完成,它们可以一起运行无关紧要。

User 1发送第二个请求,他发送的第一个请求尚未完成 - >我们在threadUser1上发送此请求,因此它将等待request1完成。

基本上,收到请求后,它只应放在同一用户发送的队列后面,并与其他所有内容同时运行。

我认为可行的方式:

我考虑过从主线程发布并发列表中的每个请求,并让线程检查该列表( while true ),然后从他们所属的用户中选择请求。

有一些问题: - 我需要每次检查整个列表,以便正确的用户提出请求。

  • 这假设我已经为每个可能的用户运行了一个线程,我没有,我只知道用户第一次发短信时的ID。

  • 效率,可能会有大量循环一遍又一遍地检查同一个列表。

  • 在该用户的所有请求完成后,线程应停止

关于最后一点:这是因为我需要限制 MAX ,因此在我们已经运行 MAX 线程的情况下收到任何请求,这些新请求不属于任何当前用户( aka running thread )都是正常处理的(在主线程中排队,一个接一个地排队)。

我真的不知道如何解决这个问题,如果有人能指出我正确的方向,我会很高兴。

1 个答案:

答案 0 :(得分:-1)

您需要您的线程知道他们正在处理的任务以及他们正在为之工作的用户。但是,您需要有限数量的线程。

我认为在架构上,最好的方法是启动有限数量的线程,让它们能够处理来自任意用户的任务,但不允许多个线程同时为同一个用户工作。 / p>

要执行此操作,请保留三组用户对象,一组用于具有不完整任务的所有用户,一组用于已分配线程的用户,一组用于未分配线程的用户给他们。将所有三个集合放在一个线程安全的用户跟踪对象中。您还需要从用户到任务的映射,或者您需要按照排队顺序完成任务,从用户到任务队列。

排队任务时,请同步用户跟踪对象,然后选中具有未完成任务的用户组。如果相关用户不存在,请创建它并将其放入具有不完整任务的用户集以及没有关联线程的用户集中。然后将任务放在线程安全的Map中,从用户到任务。最后,退出用户跟踪对象上的同步。执行此同步的最简单方法是将此处理放在用户跟踪对象中的同步方法中。

每个线程都分配给用户,该用户可以为null。线程通过同步用户跟踪对象来启动其循环,然后获取任务可用的任务。

要获取任务,线程首先检查它是否已分配给非空用户。如果是,则检查Map以查找该用户的任务。如果找到一个,则线程将从地图中删除任务以进行维护。如果它没有找到该用户的任务,则会从具有不完整任务的用户集中删除该用户,并从具有已分配线程的用户集中删除该用户,然后将其分配给的用户设置为空。

如果将线程分配给空用户,则会检查没有分配线程的用户集。如果找到一个,它会将自己分配给该用户,并将该用户从没有分配线程的用户组移动到具有分配线程的用户组。然后,线程检查Map以查找与该用户关联的任务 - 保证是一个 - 并将其删除以进行维护。

获取任务后,在服务之前,线程退出在用户跟踪对象上同步的代码块。同样,最好在用户跟踪对象中使用同步方法来获取任务的过程。退出synchronized块后,线程完成任务。如果线程最终没有获得任务,因为除了已经分配线程的用户之外没有其他任何可用,线程可以在唤醒和重新检查之前休眠一段时间,但这应该在同步块之外。

您可以找出自己使用的特定类。你可以通过让线程退出而不是休眠来获得更复杂的功能,然后根据需要重新启动它们,但最好先保持简单。