一個簡單的 Java 自動批處理隊列

實際中可能有這樣的應用場景,獲得一個記錄不須要當即去處理它,而是等累積到必定數量時再批量處理它們。咱們能夠用一個計數器,來一個加一個,量大時一塊處理,而後又重零開始計數。若是記錄的來源單一還好辦,要是有多個數據源來提供記錄就會有多線程環境下數據丟失的問題。java

這裏我編寫了一個最簡單的任務批處理的隊列,構造了告訴它批處理數量,消費者,而後就只管往隊列裏添加記錄,隊列在知足條件時自動進行批處理。由於內部使用的是 BlockingQuque 來存儲記錄,因此多線程往裏同時添加記錄也不要緊,最後的未達到 batchSize, 的那些記錄可主動調用 completeAll() 函數或在達到 timeout 後來觸發批處理,而且結束隊列內的循環線程。安全

注意: 多線程環境下往一個無線程保護的集合或結構中,如 ArrayList, LinkedList, HashMap, StringBuilder 中添加記錄很是容易形成數據的丟失,而往有線程保護的目的地寫東西就安全了,如 Vector, Hashtable, StringBuffer, BlockingQueue。固然性能上要付出一點代價,不過對於使用了可重入鎖(ReentrantLock), 而非同步鎖(synchronized) 的數據結構仍是能夠放心使用的。數據結構

下面是 BatchQueue 的簡單實現 閱讀全文 >>多線程

相關文章
相關標籤/搜索