制片人 - 消费者模型;存储缓冲区进入和退出时间

时间:2014-03-28 10:29:47

标签: java arrays concurrency

我目前正在尝试解决基于与并发编程相关的生产者 - 消费者模型的问题。我有一个有界缓冲区,存储以先进先出的方式进入和离开缓冲区的整数值。

我想做的是随机化每个对象在缓冲区中停留的时间,之后它将被标记给消费者,是时候从缓冲区收集这个对象了。

到目前为止我的想法如下:

  • 在生产者端,为每个值分配int。除了int(用于标识对象)之外,还会创建一个日期戳来存储对象放入缓冲区的时间

  • 在缓冲区中,将生成随机“停留”时间并将其添加到此开始时间以创建退出时间

  • 然后,消费者类将首先搜索缓冲区中的项目,然后搜索已达到退出时间的项目,然后从缓冲区中删除该对象,使用生成的int来识别哪个元素已被删除

有没有办法用一个数组做到这一点?

我应该查看并行数组,一个用于存储标识每个元素的整数,还有一个用于存储入口时间的并行索引?

在最后一种情况下,我会在缓冲区中使用2个put方法将'时间戳'分配给第二个数组中的并行索引。

2 个答案:

答案 0 :(得分:1)

我认为您可以使用优先级队列。您只需在插入时为每个元素设置随机优先级。此优先级将作为停留时间。如果你的消费者在队列中有元素时会出队,那么这应该会给你带来同样的效果。

如果队列中可能包含元素,并且只有停留时间已经通过,那么您可以将其用作优先级(当前时间+随机停留时间)。在这种情况下,消费者只需要检查队列头部的循环,并验证优先级是否等于当前时间

答案 1 :(得分:0)

这已经有一段时间了,但我认为值得为将来发现这个问题的人提供反馈!

解决方案在于有效利用时间戳;作为代表客户来到百货商店的对象的一部分(包含客户名称,客户入口等的设置者和获取者),当他们到达商店时保存了时间戳,然后由生产者随机分配延迟(在进入缓冲区之前表示门处的队列。进入缓冲区后,再次从生产者记录时间并保存到客户对象。一旦进入缓冲区,第二个随机分配的延迟时间被添加到初始输入时间以表示购物时间。消费者类通过客户对象每5秒搜索一次,以查看哪些客户(如果有的话)将要离开商店。

以上是仅使用1个数组实现的,因为时间存储在客户对象中。我选择这种方法,因为它似乎更整洁(在使用更少的代码方面)。一个包含2个数组的解决方案也可以工作,只需要几行代码......

希望清楚明白!

由于