2014-03-28 57 views
0

我目前正在嘗試解決一個基於生產者 - 消費者模型的併發編程問題。我有一個有界的緩衝區,存儲以先進先出方式進入和離開緩衝區的整數值。生產者 - 消費者模型;存儲緩衝區進入和退出時間

我想要做的是隨機化每個對象停留在緩衝區中的時間量,在此之後它會被標記給使用者,以便從緩衝區收集此對象。

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

  • 在生產者端,int被分配給每一個值。除了此int(用於標識對象),將創建一個日期戳記以存儲對象放入緩衝區的時間。

  • 而在緩衝區中,將生成隨機「停留」時間並添加到這個開始時間創建退出時間

  • 然後消費者類將首先搜索緩衝區中的項目,然後查找已經達到其退出時間的項目,然後使用生成的int從緩衝區中刪除該對象識別哪個元素已被刪除

有沒有辦法用一個數組來做到這一點?

我應該看看平行數組,其中一個用於存儲標識每個元素的整數,還有一個用於存儲入口時間的並行索引?

在這最後一種情況下,我會在緩衝區中使用2個put方法將「時間戳」分配給第二個數組中的並行索引。

+0

您可以使用阻塞隊列作爲有界緩衝區。像ArrayBlockingQueue (int容量),如果你不想處理低級線程同步,就像在同步的add/remove方法中使用wait()和notify()方法一樣。 – Aniket

回答

1

我想你可以使用優先隊列。插入時,您只需爲每個元素賦予一個隨機優先級。此優先權將作爲您的停留時間。如果您的客戶將在隊列中存在元素時出隊,那麼這應該會給您帶來相同的效果。

如果可能在隊列中的元素,你只出列他們如果停留時間已經過去了,那麼你可以優先(當前時間+隨機停留時間)使用。在這種情況下,消費者只需在循環中檢查隊列頭並驗證優先級是否等於當前時間

0

這已經有一段時間了,但我認爲值得爲將來發現這個問題的任何人提供反饋!

解決方案在於有效使用時間戳;作爲表示來到百貨商店的顧客(包含顧客姓名,顧客入口等的設置者和獲取者)的對象的一部分,當到達商店時時間戳被保存,然後由生產者隨機分配一個時間戳在門口表示一個隊列)在他們進入緩衝區之前。進入緩衝區後,再次從生產者記錄時間並保存到客戶對象。一旦進入緩衝區,第二個隨機分配的延遲時間被添加到初始輸入時間以表示購物時間。消費者類每5秒鐘通過客戶對象搜索,以查看哪些客戶(如果有的話)將要離開商店。

由於時間存儲在客戶對象中,因此僅使用1個數組即可實現上述功能。我選擇這種方法,因爲它似乎更加整潔(就使用更少的代碼而言)。一個2陣列的解決方案也可以工作,只是意味着更多的代碼行...

希望明確的理解!

謝謝

相關問題