java多線程消息隊列的實現(xiàn)代碼
更新時間:2017年07月24日 10:06:59 作者:Mr_linjw
本篇文章主要介紹了java多線程消息隊列的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
本文介紹了java多線程消息隊列的實現(xiàn)代碼,分享給大家,希望對大家有幫助,順便也自己留個筆記
1、定義一個隊列緩存池:
//static修飾的成員變量和成員方法獨立于該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享。 private static List<Queue> queueCache = new LinkedList<Queue>();
2、定義隊列緩沖池最大消息數(shù),如果達到該值,那么隊列檢入將等待檢出低于該值時繼續(xù)進行。
private Integer offerMaxQueue = 2000;
3、定義檢出線程,如果隊列緩沖池沒有消息,那么檢出線程會線程等待中
new Thread(){ public void run(){ while(true){ String ip = null; try { synchronized (queueCache) { Integer size = queueCache.size(); if(size==0){ //隊列緩存池沒有消息,等待。。。。 queueCache.wait(); } Queue queue = queueCache.remove(0); if(isIpLock(queueStr)){//假若這個是一個多應用的分布式系統(tǒng),那么這個判斷應該是分布式鎖,這里說的鎖不是線程停止,而是跳過該消息,滯后處理 queueCache.add(queue);該queue重新加入隊列緩沖池,滯后處理, continue; }else{ ;//這里是處理該消息的操作。 } size = queueCache.size(); if(size<offerMaxQueue&&size>=0){ queueCache.notifyAll();//在隊列緩存池不超過最大值的前提下,假若檢入正在等待中,那么那么讓他們排隊檢入。 } } } catch (Exception e) { e.printStackTrace(); }finally{ try {//檢出該消息隊列的鎖 unIpLock(queueStr); } catch (Execption e) {//捕獲異常,不能讓線程掛掉 e.printStackTrace(); } } } }.start();
4、檢入隊列
synchronized (queueCache) { while(true){ Integer size = queueCache.size(); if(size>=offerMaxQueue){ try { queueCache.wait(); continue;//繼續(xù)執(zhí)行等待中的檢入任務。 } catch (InterruptedException e) { e.printStackTrace(); } }//IF if(size<=offerMaxQueue&&size>0){ queueCache.notifyAll(); } break;//檢入完畢 }//while }
5、鎖方法實現(xiàn)
/** * 鎖 * @param ip * @return * @throws */ public Boolean isLock(String queueStr) { return this.redisManager.setnx(queueStr+"_lock", "LOCK", 10000)!=1; } //解鎖 public void unIpLock(String queueStr) { if(ip!=null){ this.redisManager.del(queueStr+"_lock"); // lock.unlock(); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Spring Security Remember me使用及原理詳解
這篇文章主要介紹了Spring Security Remember me使用及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09解決springboot啟動Logback報錯ERROR in ch.qos.logback.cla
這篇文章主要介紹了解決springboot啟動Logback報錯ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rena問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Spring?cloud?OpenFeign中動態(tài)URl、動態(tài)傳遞接口地址代碼示例
openFeign是作為微服務之間調用的解決方案,每個微服務項目是必不可少的,下面這篇文章主要給大家介紹了關于Spring?cloud?OpenFeign中動態(tài)URl、動態(tài)傳遞接口地址的相關資料,需要的朋友可以參考下2024-02-02