0
我有一個生成器線程可以生成對象並將其放入共享隊列中。將隊列條目廣播到多個線程
我已經產生了一堆消費者線程,可以從這個隊列中讀取。
在理想情況下,我的每一位員工都會從隊列中選擇下一份工作。但是對於某些對象(具有某個屬性),我的每個消費者線程都需要該對象的副本(沒有任何重複項)。
我的第一個衝動是在每次推入隊列之前檢查對象的屬性。如果屬性存在,則創建n個副本(這裏n等於我擁有的工作人員的數量),並將這n個副本推送到隊列中。
該隊列將需要做一些簿記,以防止同一個工人不止一次獲得對象。
執行此簿記的一種方法是創建一個Map,其中鍵爲對象,值爲worker-id(它可以是線程ID)。
對於每個彈出請求,隊列將檢查對象是否已被當前線程ID處理。如果線索ID存在於地圖中,它將退出臨界區而不從隊列中彈出對象,否則將彈出對象並更新地圖。
這種方法的問題在於,很可能單個線程可能使其他線程無法訪問隊列。
有人可以提出一個優雅的方式來解決這個問題?
感謝
這是一個好主意。根據產生的工作人員數量,我可以爲每個工作人員創建一個隊列,然後將該項目推送到每個隊列。唯一的問題是,排隊的數量將隨着消費者的數量成比例地增加。千名工人......千列隊。但我認爲這是一個比替代方案更好的主意,製作了一千份副本並實施了一套複雜的簿記機制,將其分散到消費者當中。 – 2012-08-01 02:58:14