gpt4 book ai didi

java - Java中只保留每个子线程最后一项的并发队列

转载 作者:行者123 更新时间:2023-12-04 03:16:50 27 4
gpt4 key购买 nike

我有 1 个启动 n 子线程的主线程。这些子线程中的每一个都不断地产生一个新事件并将其添加到共享队列中。该事件表示子线程上复杂计算的最新状态。

主线程使用共享队列,但它对处理仍在队列中的所有事件不感兴趣:如果一个子线程向队列发送 3 个事件,主线程只对最后一个感兴趣。可以丢弃该子线程的旧事件(一旦子线程添加了较新的事件)。

例如:

childThread A adds event A1
mainThread removes event A1

childThread B adds event B1
childThread B adds event B2 // => B1 should be discarded
childThread B adds event B3 // => B2 should be discarded
mainThread removes event B3

childThread A adds event A2
childThread A adds event A3 // => A2 should be discarded
childThread B adds event B4
mainThread removes event A3
mainThread removes event B4

childThread B adds event B5
childThread A adds event A4
childThread A adds event A5 // => A4 should be discarded
childThread B adds event B6 // => B5 should be discarded
childThread A adds event A6 // => A5 should be discarded
mainThread removes event B6 // do B6 first because B5 was before A4
mainThread removes event A6

可选要求:主线程确实希望尽可能多地循环处理子线程的事件,但如果没有子线程产生事件,主线程仍然会阻塞。

最佳答案

我会使用两个数据结构:1 个用于“触发器”的 BlockingQueue 和 1 个用于引用最新事件的 Map。

EventSource 将:

  1. 在新事件上为 map 创建一个条目(当键已经存在时更新旧的)Key = "this"(EventSource) , Value = Latest Event
  2. 在新事件上,使用“this”(EventSource) 在 BlockingQueue 中创建一个条目,但前提是其中还没有条目。

最后一部分是可选的。它只是减少了对 map 的不成功查找。您也可以只在每个新事件上添加触发器。每次查找对映射中的键是否定的都忽略它。

消费者将:

  1. 等待阻塞队列非空。
  2. 移除 top,将其用作 Event-Map 的键 ...
  3. 未找到 key :继续下一个队列项目。
  4. 找到键:删除条目和过程值(即事件)
  5. 循环到 1。

关于java - Java中只保留每个子线程最后一项的并发队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com