【发布时间】:2017-07-13 19:43:13
【问题描述】:
我有一个接收函数请求的后端
update(by_whom, payload);
然后我处理请求,并相应地回答。
每次用户发送请求,消息都会经过多个处理对象,然后才会产生答案。
现在,我将如何处理每个用户在他自己的线程中?我不明白如何将事件分派到定制线程。
示例:
User 1 发送第一个请求 -> 我们创建一个 ThreadUser1 并在那里处理它。
User 2 发送第一个请求 -> 我们创建一个 ThreadUser2 并在那里处理它,如果来自 user1 的 request1 没有完成,它们可以一起运行。
User 1 发送第二个请求,他发送的第一个还没有完成 -> 我们在 threadUser1 上分发这个请求,因此它会等待 request1 完成。
基本上,在收到请求后,它应该只放在同一用户发送的请求后面的队列中,并与其他所有请求同时运行。
我认为可行的方法:
我考虑将每个请求从主线程发布到并发列表中,并让线程检查该列表(如果为真),然后从它们所属的用户那里挑选请求。
这有几个问题: - 每次我都需要检查整个列表以查找正确用户的请求。
这假设我已经为每个可能的用户运行了一个线程,但我没有,我只知道用户第一次发短信时的 id。
效率,可能有大量循环一遍又一遍地检查同一个列表。
线程应该在该用户的所有请求完成后停止。
关于最后一点:这是因为我需要有一个限制 MAX 在我们已经有 MAX 个线程运行时收到的任何请求,这些新请求不属于任何当前用户(aka running thread)都会正常处理(在主线程中排队,一个接一个)。
我真的不知道该怎么做,如果有人能指出我正确的方向,我会很高兴。
【问题讨论】:
-
有一张地图
user -> tasks。当请求进入时,将任务列表添加到该映射并安排工作线程在此列表上工作 - 如果同时有来自同一用户的另一个请求到达,您将找到它的列表,您可以简单地添加到该列表中。让服务器控制对地图的访问,即每个工作人员都必须通知其完成以让服务器清理(或重新安排)。然后让列表(例如queue)同步 s.t.线程可以异步地从中拉取新调度的请求。 -
如果我理解正确,您在线程之间没有任何共享状态,您可以使用每个线程的队列来保持请求与一个线程相关联。要处理“最大”数量的线程,我建议使用 FixedThreadPool(请参阅
Executors.newFixedThreadPool:docs.oracle.com/javase/7/docs/api/java/util/concurrent/…)?如有必要,我可以写一个小要点
标签: java multithreading design-patterns