我有一个生产者线程,它生成对象并将其放在共享队列中。
我已经产生了一堆可以从这个队列中读取的消费者线程。
在理想的情况下,我的每个工作人员都会从队列中接收下一份工作。但对于某些对象(具有某个属性),我的每个消费者线程都需要该对象的副本(没有任何重复)。
我的第一个冲动是在每次推送到队列之前检查对象的属性。如果该属性存在,则创建n个副本(此处n等于我拥有的工作者数量)并将这n个副本推送到队列。
队列需要做一些簿记,以防止同一个工人不止一次获得该对象。
执行此预订的一种方法是使用Map,其中键是对象,值是worker-id的集合(它可以是线程ID)。
对于每个pop请求,队列将检查该对象是否已被当前thread-id处理。如果地图中存在thread-id,它将退出临界区而不从队列中弹出对象,否则它将弹出对象并更新地图。
这种方法的问题在于,单个线程很可能会使其他线程无法访问队列。
有人可以提出一个优雅的方法来解决这个问题吗?
由于
答案 0 :(得分:2)
我的建议:
如果您想要花哨,可以通过其他指标确定最短队列,例如:累积的对象大小或特定消费者的一些定制服务质量。