java多線程消息隊(duì)列的實(shí)現(xiàn)代碼
本文介紹了java多線程消息隊(duì)列的實(shí)現(xiàn)代碼,分享給大家,希望對(duì)大家有幫助,順便也自己留個(gè)筆記
1、定義一個(gè)隊(duì)列緩存池:
//static修飾的成員變量和成員方法獨(dú)立于該類的任何對(duì)象。也就是說(shuō),它不依賴類特定的實(shí)例,被類的所有實(shí)例共享。 private static List<Queue> queueCache = new LinkedList<Queue>();
2、定義隊(duì)列緩沖池最大消息數(shù),如果達(dá)到該值,那么隊(duì)列檢入將等待檢出低于該值時(shí)繼續(xù)進(jìn)行。
private Integer offerMaxQueue = 2000;
3、定義檢出線程,如果隊(duì)列緩沖池沒(méi)有消息,那么檢出線程會(huì)線程等待中
new Thread(){
public void run(){
while(true){
String ip = null;
try {
synchronized (queueCache) {
Integer size = queueCache.size();
if(size==0){
//隊(duì)列緩存池沒(méi)有消息,等待。。。。 queueCache.wait();
}
Queue queue = queueCache.remove(0);
if(isIpLock(queueStr)){//假若這個(gè)是一個(gè)多應(yīng)用的分布式系統(tǒng),那么這個(gè)判斷應(yīng)該是分布式鎖,這里說(shuō)的鎖不是線程停止,而是跳過(guò)該消息,滯后處理
queueCache.add(queue);該queue重新加入隊(duì)列緩沖池,滯后處理,
continue;
}else{
;//這里是處理該消息的操作。
}
size = queueCache.size();
if(size<offerMaxQueue&&size>=0){ queueCache.notifyAll();//在隊(duì)列緩存池不超過(guò)最大值的前提下,假若檢入正在等待中,那么那么讓他們排隊(duì)檢入。
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {//檢出該消息隊(duì)列的鎖
unIpLock(queueStr);
} catch (Execption e) {//捕獲異常,不能讓線程掛掉
e.printStackTrace();
}
}
}
}.start();
4、檢入隊(duì)列
synchronized (queueCache) {
while(true){
Integer size = queueCache.size();
if(size>=offerMaxQueue){
try {
queueCache.wait();
continue;//繼續(xù)執(zhí)行等待中的檢入任務(wù)。
} catch (InterruptedException e) {
e.printStackTrace();
}
}//IF
if(size<=offerMaxQueue&&size>0){
queueCache.notifyAll();
}
break;//檢入完畢
}//while
}
5、鎖方法實(shí)現(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();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java+Swing實(shí)現(xiàn)經(jīng)典五子棋游戲
五子棋是世界智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一,是一種兩人對(duì)弈的純策略型棋類游戲,是世界智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一。本文將采用Java Swing實(shí)現(xiàn)這一經(jīng)典游戲,需要的可以參考一下2022-01-01
sentinel整合ribbon與fallback流程分步講解
這篇文章主要介紹了sentinel整合ribbon與fallback分步流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
解決org.apache.ibatis.binding.BindingException:?Invalid?boun
這篇文章主要介紹了解決org.apache.ibatis.binding.BindingException:?Invalid?bound?statement?(not?found)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
SpringBoot中優(yōu)化if-else語(yǔ)句的七種方法
if-else語(yǔ)句是控制流程的基本工具,但過(guò)度使用會(huì)使代碼變得復(fù)雜且難以維護(hù),在SpringBoot , SpringCloud項(xiàng)目中,優(yōu)化if-else結(jié)構(gòu)變得尤為重要,本文將深入探討七種策略,旨在減少SpringBoot , SpringCloud項(xiàng)目中 if-else的使用,需要的朋友可以參考下2024-07-07
BUUCTF-easy java WEB-INF/web.xml泄露漏洞及其利用方式
這篇文章主要介紹了BUUCTF-easy java WEB-INF/web.xml泄露漏洞及其利用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

