gpt4 book ai didi

java - 在处理之前让队列建立一定数量

转载 作者:行者123 更新时间:2023-11-29 07:30:34 25 4
gpt4 key购买 nike

那么让我给你一个关于我正在尝试做的事情的想法:
我有一个记录统计数据的程序,其中有很多很多,但它会在它们发生时一次记录它们并将它们放入 ArrayList 中,例如:
请注意这是一个例子,我没有记录这些统计数据,我只是稍微简化一下

用户点击 -> 添加 user_click 到数组
用户点击 -> 添加 user_click 到数组
按键 -> 添加 key_press 到数组

在每个事件(点击、按键等)之后,它会检查 ArrayList 的大小,如果大于 150,则会发生以下情况:
创建了一个新线程
该线程获得了 ArrayList
的副本原始 ArrayList 是 .clear()'ed
新线程合并了相似的项目,因此 user_click 现在将是一个数量为 2 的项目,而不是 2 个项目,每个项目的数量为 1
线程处理数据到MySQL db

我很想找到一个更好的方法来解决这个问题,尽管它工作得很好。线程池和立即处理的问题是,如果不先将它们组合起来,每天实际上会有数千个 MySQL 查询。

有没有更好的方法来实现这一点?我的方法可以吗?
另一件要记住的事情是 events 被触发和记录的线程不能放慢速度,所以我真的不想在主线程中组合项目。

如果您有代码示例那就太好了,如果不仅仅是一个好的方法的想法也太棒了!

对于任何感兴趣的人,这个项目托管在 GitHub 上,主线程是 here , 队列处理器是 here请原谅我糟糕的命名约定和一般的代码清洁度,我仍在(一直)学习!

最佳答案

描述的逻辑看起来还不错,有两个调整:

  • 不要复制列表并清除原始列表。发送原件并为 future 的事件创建一个新列表。这消除了复制条目的 O(n) 处理时间。

  • 不要每次都创建一个新线程。无论如何,事件都会延迟,因为您正在收集它们,所以写入数据库的及时性不是您主要关心的问题。两种选择:

    • 预先启动一个线程,然后使用 BlockingQueue将列表从线程 1 发送到线程 2。如果线程 2 落后,列表将简单地累积在队列中,直到线程 2 可以 catch ,而不会延迟线程 1,也不会因线程过多而使系统过载。

    • 将作业提交到线程池,例如使用 Executor .这将允许多个(但数量有限)线程处理列表,以防处理速度比事件生成慢。缺点是事件可能会乱写。

为了separation of concern的目的和可重用性,您应该封装逻辑收集事件,并将它们发送到 block 中的线程进行处理,在单独的类中,而不是嵌入该逻辑 在事件生成代码中。

这样您就可以轻松添加额外的功能,例如在达到正常阈值 (150) 之前刷新未决事件的超时,因此如果事件生成速度变慢,事件不会在那里停留太久。

关于java - 在处理之前让队列建立一定数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43416518/

25 4 0
文章推荐: java - Q : Solve almostIncreasingSequence in Java (Codefights)
文章推荐: mysql - 为什么我的 Google Cloud SQL (MySQL) 库每秒收到多个请求(写入),而我的应用程序什么都不做?
文章推荐: php - 如何使用 php 从 mysql 数据库显示