在Java中处理大量异步调用

时间:2019-03-27 06:09:16

标签: java scheduled-tasks

我正在设计一个提醒(有成千上万的用户)。时间到时,提醒需要用消息提醒用户。

一个可能的解决方案是创建一个新线程,并等待该线程运行直到提醒时间,然后将消息发送给该特定用户。

可以使用ScheduledExecutorService或Java Timer完成此操作。

有没有比创建新线程并等待时间到了再终止线程更好的方法。

2 个答案:

答案 0 :(得分:1)

您可以使用一个线程。还有另一个用于发送消息的线程池(用于不减慢主线程的速度)。您需要按顺序排列提醒时间,并且每个提醒时间都有对应的用户列表。主线程进入睡眠状态直到下一个提醒时间,然后唤醒并通知与该提醒时间相对应的用户。

但是这种方法有其缺点。例如,您需要解决问题:如何添加用户?如果它们增加了当前时刻与主线程唤醒之间的下一个时刻之间的提醒时间。唤醒主线程或为此使用备用线程。

答案 1 :(得分:1)

看看Event Loop模式。它是专为C10k problem创建的。
对于实现,您可以看一下Vert.x。 Vert.x的事件循环实际上是经典的事件循环,它通过将这些事件传递到适当的服务处理程序来等待同时处理的事件。
所有的顶点(您可以将一个顶点视为异步vert.x服务)都通过事件总线相互通信,该事件总线形成了一个跨多个服务器节点和多个浏览器的分布式对等消息传递系统。

Vert.X tutorial 对这个主题有很好的解释,将帮助您编写自己的异步服务。