2011-10-10 59 views
1

我打算在幾天內開始一個新項目,我想在設計要點上進行一些審查。我應該在Java多線程中使用哪種數據結構?

存在舊的遺留代碼,它在內存數據庫中使用散列表。有一個線程使用來自文件和套接字的xml提要並填充此散列表,另一個線程進行驗證和更新,如果驗證成功,則第三個線程將驗證的數據保留在數據庫中。由於在更新期間性能很差(意味着其他兩個線程快速追趕並等待驗證線程完成),我計劃使用一個concurrenthashmap來爲我的解決方案建立原型,並創建多個線程進行驗證。我仍處於原型設計階段,但希望得到一些關於我是否朝着正確方向前進的反饋。先謝謝你。

回答

1

我不認爲併發哈希映射會幫助。我假設你在散列表中創建了多個條目,並且在驗證後將它們存儲在數據庫中。問題是您的持久線程必須等待驗證完成。

如果哈希表中的所有條目都是相互關聯的,驗證器必須檢查所有條目 - 您可以做的事情不多,只能等待。但是,如果您可以分解小塊中的驗證(最簡單的情況是條目根本不相關),那麼您可以將驗證與多個線程並行化,或者使用消費者/生產者模式來存儲數據。也就是說,一旦驗證程序完成一個塊,它會將其發佈到隊列中,持久性線程將從隊列中讀取並存儲該塊。

如果必須檢查所有條目,則可以將它們保存爲塊,但如果驗證失敗則回滾。

+0

散列表中的每個條目都是一個集合,它不需要根據散列表中的其他條目進行驗證。他們是孤立的。每個記錄的驗證需要進行一些數據庫調用,因此每個記錄驗證都需要時間。 –

+0

因此,消費者生產商將工作得很好。事實上,它甚至可能在所有三層中都有效。一個線程池可以從隊列讀取數據並對其進行驗證,另一個線程池可以讀取已驗證的條目並將其保存在數據庫中。配置這些線程池以匹配讀者線程生成條目的速度。 –

+0

謝謝。我只是意識到這一點 - 我不認爲我們將需要存儲在一個hashmap中。我可以使用ArrayBlockingQueue來實現消費者/生產者嗎?一旦從源讀取數據(一旦我的數據被構建),我將發佈到ArrayBlockingQueue中,然後消費者線程可以來驗證並持久化驗證的數據。這會工作嗎? –

相關問題