專利名稱:一種基于lru的優(yōu)化生產(chǎn)者消費者問題排重的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機領(lǐng)域,具體的說就是基于LRU算法解決生產(chǎn)者消費者問題中過濾多個生產(chǎn)者生產(chǎn)同一產(chǎn)品的方法。
背景技術(shù):
在實際的軟件開發(fā)過程中,經(jīng)常會碰到如下場景某個模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個模塊來負(fù)責(zé)處理(此處的模塊是廣義的,可以是類、函數(shù)、線程、進程等)。產(chǎn)生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費者。單單抽象出生產(chǎn)者和消費者,還夠不上是生產(chǎn)者/消費者模式。該模式還需要有一個緩沖區(qū)處于生產(chǎn)者和消費者之間,作為一個中介。生產(chǎn)者把數(shù)據(jù)放入緩沖區(qū),而消費者從緩沖區(qū)取出數(shù)據(jù)。
在實際的軟件環(huán)境中生產(chǎn)者會有不止一個,這樣就會產(chǎn)生不同的生產(chǎn)者同時生產(chǎn)相同的產(chǎn)品。一個產(chǎn)品被多次生產(chǎn)出來,再次放入緩沖區(qū)會對整個生產(chǎn)消費過程產(chǎn)生惡劣甚至災(zāi)難性的后果。然而當(dāng)消費者消費產(chǎn)品失敗時,對產(chǎn)品的處理是一個頭痛的問題。
很多算法實現(xiàn)放入緩沖區(qū)時進行過濾,運用的方法主要包括逐個對比法、循環(huán)遍歷法。處理消費失敗產(chǎn)品的主要方式包括線程直接跳過、向上拋異常等。這兩個問題的處理不當(dāng)都會給用戶數(shù)據(jù)信息的安全和完整帶來隱患。
針對上述兩個問題,本發(fā)明提供一種基于LRU算法的優(yōu)化生產(chǎn)者消費者問題中排重的方法,同時還解決當(dāng)消費者消費產(chǎn)品失敗時失敗產(chǎn)品的再次處理問題。通過本方法能夠高效的解決現(xiàn)實中類似生產(chǎn)者消費者處理不同生產(chǎn)者生產(chǎn)同一產(chǎn)品的問題。發(fā)明內(nèi)容
本發(fā)明的目的是提供一種基于LRU的優(yōu)化生產(chǎn)者消費者問題排重的方法,具體講就是在生產(chǎn)者消費者問題中解決多個生產(chǎn)者并發(fā)生產(chǎn)同一產(chǎn)品的問題。
利用LinkedHashMap實現(xiàn)一個固定容量的基于最近最少使用算法的緩存類,在生產(chǎn)者消費者問題中解決多個生產(chǎn)者生產(chǎn)同一產(chǎn)品的問題,同時還解決當(dāng)消費者消費產(chǎn)品失敗時失敗產(chǎn)品的再次處理問題,解決類似生產(chǎn)者消費者過程中在生產(chǎn)者生產(chǎn)過程中實現(xiàn)過濾重復(fù)產(chǎn)品的問題,處理步驟是被消費者處理的數(shù)據(jù)仍舊保留在LinkedHashMap中,而發(fā)生異常的則從 LinkedHashMap中刪除掉,生產(chǎn)者并發(fā)抓取數(shù)據(jù)放入緩沖區(qū)中時,如果LinkedHashMap中已經(jīng)存在該數(shù)據(jù),則不需要再次放入,包括已經(jīng)被生產(chǎn)者消費掉的數(shù)據(jù),從而達(dá)到排重目的。
其作用為過濾產(chǎn)品防止重復(fù)消費,允許線程并發(fā)。
需要LinkedHashMap作為輔助工具實現(xiàn)具體過濾數(shù)據(jù)功能。
本方法使用LinkedHashMap進行數(shù)據(jù)處理,處理步驟是被消費者處理的數(shù)據(jù)仍舊保留在LinkedHashMap中,而發(fā)生異常的則從LinkedHashMap中刪除掉,生產(chǎn)者并發(fā)抓取數(shù)據(jù)放入緩沖區(qū)中時,如果LinkedHashMap中已經(jīng)存在該數(shù)據(jù)則不需要再次放入,包括已經(jīng)被生產(chǎn)者消費掉的數(shù)據(jù),從而達(dá)到排重目的。
具體實施方式
本發(fā)明提供了一種基于LRU算法的優(yōu)化生產(chǎn)者消費者問題中排重的方法, 利用LinkedHashMap的特性在一個固定容量的基于最近最少使用的算法實現(xiàn)排重。
首先介紹LRU算法,LRU是Least Recently Used的縮寫,即最近最少使用頁面置換算法,是為虛擬頁式存儲管理服務(wù)的,目的為節(jié)省利用容量不大的內(nèi)存為最多的進程提供資源。LRU算法的提出,是基于這樣一個事實在前面幾條指令中使用頻繁的頁面很可能在后面的幾條指令中頻繁使用。反過來說,已經(jīng)很久沒有使用的頁面很可能在未來較長的一段時間內(nèi)不會被用到。這個,就是著名的局部性原理——比內(nèi)存速度還要快的cache,也是基于同樣的原理運行的。因此,我們只需要在每次調(diào)換時,找到最近最少使用的那個頁面調(diào)出內(nèi)存。這就是LRU算法的全部內(nèi)容。
在實際的軟件開發(fā)過程中,生產(chǎn)者消費者問題隨處可見,以海量群發(fā)郵件為例說明情況。數(shù)據(jù)庫中有海量待發(fā)的客戶郵件地址,生產(chǎn)者線程(抓取數(shù)據(jù)線程)會從數(shù)據(jù)庫中抓取數(shù)據(jù)放入緩沖區(qū),消費者線程(發(fā)送郵件線程)會去緩沖區(qū)讀取數(shù)據(jù)并發(fā)送郵件。在整個讀取數(shù)據(jù)并發(fā)送郵件的過程中可能會出現(xiàn)兩個問題第一個線程去數(shù)據(jù)庫抓取數(shù)據(jù)放入緩存,但是這些數(shù)據(jù)還沒有被消費者處理掉,可是第二個線程有可能去數(shù)據(jù)庫中取出相同的數(shù)據(jù)放入緩沖區(qū)。
權(quán)利要求
1.一種基于LRU的優(yōu)化生產(chǎn)者消費者問題排重的方法,利用LinkedHashMap實現(xiàn)一個固定容量的基于最近最少使用算法的緩存類,在生產(chǎn)者消費者問題中解決多個生產(chǎn)者生產(chǎn)同一產(chǎn)品的問題,同時還解決當(dāng)消費者消費產(chǎn)品失敗時失敗產(chǎn)品的再次處理問題, 解決類似生產(chǎn)者消費者過程中在生產(chǎn)者生產(chǎn)過程中實現(xiàn)過濾重復(fù)產(chǎn)品的問題,其特征在于,使用LinkedHashMap進行數(shù)據(jù)處理,處理步驟是被消費者處理的數(shù)據(jù)仍舊保留在 LinkedHashMap中,而發(fā)生異常的則從LinkedHashMap中刪除掉,生產(chǎn)者并發(fā)抓取數(shù)據(jù)放入緩沖區(qū)中時,如果LinkedHashMap中已經(jīng)存在該數(shù)據(jù),則不需要再次放入,包括已經(jīng)被生產(chǎn)者消費掉的數(shù)據(jù),從而達(dá)到排重目的。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于其作用為過濾產(chǎn)品防止重復(fù)消費,允許線程并發(fā)。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于需要LinkedHashMap作為輔助工具實現(xiàn)具體過濾數(shù)據(jù)功能。
全文摘要
本發(fā)明提供了一種基于LRU算法的優(yōu)化生產(chǎn)者消費者問題中排重的方法,該發(fā)明提供的基于LRU算法實現(xiàn)優(yōu)化生產(chǎn)者消費者問題中生產(chǎn)重復(fù)生產(chǎn)同一產(chǎn)品的問題。將通過使用已經(jīng)實現(xiàn)了LRU算法的LinkedHashMap處理相同產(chǎn)品過濾的問題。LRU算法是LinkedHashMap本身通過雙向鏈表來實現(xiàn),當(dāng)某個位置被使用(例如get操作),通過調(diào)整鏈表的指向?qū)⒃撐恢谜{(diào)整到頭位置,新加入的內(nèi)容直接放在鏈表頭,如此一來,最近被使用的內(nèi)容就向鏈表頭移動,需要替換時(已經(jīng)達(dá)到容量時),鏈表最后的位置就是最近最少使用的位置。在多線程通過LinkedHashMap以最快方式實現(xiàn)緩沖區(qū)內(nèi)數(shù)據(jù)排重問題,避免多個生產(chǎn)者并發(fā)時造成生產(chǎn)同一產(chǎn)品的問題。
文檔編號G06F9/44GK102520955SQ201110424508
公開日2012年6月27日 申請日期2011年12月19日 優(yōu)先權(quán)日2011年12月19日
發(fā)明者趙文文 申請人:浪潮電子信息產(chǎn)業(yè)股份有限公司