記使用阻塞佇列的坑

2021-07-27 17:14:16 字數 2217 閱讀 9754

由於專案需求,使用多執行緒處理資料,期間資料量後期可能達到百萬甚至千萬級別,所以考慮使用阻塞佇列儲存,所有資料

使用的是 linkedblockingqueue 佇列,大小設定為   10000     每次資料庫中只取號碼list  每個list大小  500   所以可以支撐資料量是  500w

下面的**是沒有問題的

貼原始碼:

/**

* 獲取所有號碼列表 存入佇列中

* @param gprstime

* @return

*/public blockingqueue getallphonenumber(string gprstime)

logger.info("phone number queue end " + blockingqueue.size());

return blockingqueue;

}

取出所有需要處理的資料之後,使用執行緒池針對每個號碼,單獨處理所需要的資料

貼原始碼:

沒有直接使用 執行緒池 newfixedthreadpool,因為這個執行緒池中預設使用的是無界佇列,可能會把機器記憶體佔滿,所以自己封裝執行緒池

public static executorservice newfixedthreadpool(int nthreads)
執行緒池大小 10,阻塞佇列大小10 k

//快取所有需要查詢的號碼

blockingqueue> allphonenumber = getallphonenumber(gprstime);

//使用阻塞佇列和執行緒池處理

blockingqueuequeue = new linkedblockingqueue(thread_pool_count);

threadpoolexecutor executor = new threadpoolexecutor(thread_pool_count, thread_pool_count, thread_pool_count, timeunit.minutes, queue, new threadpoolexecutor.callerrunspolicy());

listphonenumberlist = null;

logger.info("threadpool begin :");

while ((phonenumberlist = allphonenumber.poll()) != null)

});totalcount += finalphonenumberlist.size();

}executor.shutdown();

executor.awaittermination(long.max_value, timeunit.days);

logger.info("threadpool end ");

遇到的坑就是 while迴圈的位置,編寫的本意是迴圈取 佇列中的資料,直到隊列為空,退出迴圈   ,但是之前一直用的是佇列的take方法,造成執行緒跑一半就不跑了,查了半天,最後發現是take方法,定義是 一出並返回佇列頭部元素,如果隊列為空,則堵塞,哎,只怪自己沒有搞清楚佇列的方法,用錯了,導致程式一直阻塞,完全停不下來,日誌也看不出來

最後附加下 佇列的幾個常用方法,根據需求謹慎使用:

add        增加乙個元索                     如果佇列已滿,則丟擲乙個iiiegaislabeepeplian異常

remove 移除並返回佇列頭部的元素 如果隊列為空,則丟擲乙個nosuchelementexception異常

element 返回佇列頭部的元素 如果隊列為空,則丟擲乙個nosuchelementexception異常

offer 新增乙個元素並返回true 如果佇列已滿,則返回false

poll 移除並返問佇列頭部的元素 如果隊列為空,則返回null

peek 返回佇列頭部的元素 如果隊列為空,則返回null

put 新增乙個元素 如果佇列滿,則阻塞

take 移除並返回佇列頭部的元素 如果隊列為空,則阻塞

感覺自己好嘍逼,特此一記

決定以後犯過乙個錯就寫乙個部落格,10年後看看飯了多少二逼錯誤

阻塞佇列BlockingQueue使用

blockingqueue的原理及方法 blockingqueue最終會有四種狀況,丟擲異常 返回特殊值 阻塞 超時,下表總結了這些方法 丟擲異常 特殊值阻塞 超時插入add e offer e put e offer e,time,unit 移除remove poll take poll time...

阻塞佇列使用方式詳解

阻塞佇列 方法 處理方式 丟擲異常 返回特殊值 一直阻塞 超時退出 插入方法 add e offer e put e offer e,time,unit 移除方法 remove poll take poll time,unit 檢查方法 element peek 不可用不可用 丟擲異常 生產者在ad...

阻塞佇列理論以及使用

在多執行緒領域,所謂阻塞,在某些情況下會掛起執行緒 即阻塞 一旦滿足條件,被掛起的執行緒又會自動被喚醒。為什麼需要blockingqueue?好處是我們不需要關心什麼時候需要阻塞執行緒,什麼時候需要喚醒執行緒,因為這一切blockingqueue已經做好阻塞的控制。黃色標記的是重點!arrayblo...