色欲av一区久久精品_久久综合色综合色88_无码在线观看不卡_色黄视频网站_亚洲国产精品久久久久秋霞66

Java實(shí)現(xiàn)搶紅包功用

時(shí)間:2023-05-16

用多線程模仿多人一起搶紅包。服務(wù)端將玩家發(fā)出的紅包保存在一個(gè)行列里,然后用Job守時(shí)將紅包信息推送給玩家。每一批玩家的搶紅包懇求,其實(shí)操作的都是從行列中彈出的第一個(gè)紅包元素,但當(dāng)時(shí)的紅包數(shù)量為空的時(shí)分,主動(dòng)彈出下一個(gè)紅包(如果有的話)。
關(guān)鍵思維:
1.搶紅包涉及多人并發(fā)操作,需求做好同步保證多線程運(yùn)行結(jié)果正確。
2.因?yàn)橐黄鹪诰€人數(shù)大,從功能方面考慮,玩家的發(fā)紅包懇求不必及時(shí)響應(yīng),而由服務(wù)端守時(shí)履行發(fā)紅包行列。
下面是主要的代碼和完成邏輯闡明
1.創(chuàng)建一個(gè)類,表示紅包這個(gè)實(shí)體概念。直接選用原子變量保證增減同步。Java的原子變量是一種精度更細(xì)的同步機(jī)制,在高度競(jìng)賽的狀況下,鎖的功能將超過(guò)原子變量的功能,但在更真實(shí)的競(jìng)賽狀況,原子變量享有更好的功能。Java

publicclassSpringGift{
privateStringrole;
privateAtomicIntegergift;
publicStringgetRole(){
returnrole;
}
publicvoidsetRole(Stringrole){
this.role=role;
}
publicAtomicIntegergetGift(){
returngift;
}
publicvoidsetGift(AtomicIntegergift){
this.gift=gift;
}
publicintgetRemainCount(){
returnthis.gift.get();
}
}
2.選用多線程模仿多人一起搶紅包。服務(wù)端將玩家發(fā)出的紅包保存在一個(gè)行列里,然后用Job守時(shí)將紅包信息推送給玩家。每一批玩家的搶紅包懇求,其實(shí)操作的都是從行列中彈出的第一個(gè)紅包元素,但當(dāng)時(shí)的紅包數(shù)量為空的時(shí)分,主動(dòng)彈出下一個(gè)紅包(如果有的話)。
publicclassTest{
publicstaticConcurrentLinkedQueuequeue;
publicstaticSpringGiftcurrGift;
publicstaticAtomicIntegercount=newAtomicInteger();
staticclassmyThreadimplementsRunnable{
publicvoidrun(){
handleEvent();
}
}
publicstaticvoidmain(String[]args)throwsException{
queue=newConcurrentLinkedQueue();
for(inti=0;i<3;i++){
SpringGiftgift=newSpringGift();
gift.setRole(“role”+i);
gift.setGift(newAtomicInteger(50));
queue.add(gift);
}
myThreadmythread=newmyThread();
for(inti=0;i<1000;i++){
newThread(mythread).start();
}
System.err.println(“一共收到”+count.get());
}
privatestaticSpringGiftgetGift(){
//防止多條線程一起彈出隊(duì)首
synchronized(queue){//若沒(méi)有加鎖,打印的count總數(shù)不對(duì)?。。?!
if(currGift==null||currGift.getRemainCount()<=0){
currGift=queue.poll();
}
}
returncurrGift;
}
publicstaticvoidhandleEvent(){
try{
SpringGiftobj=getGift();
if(obj==null||obj.getRemainCount()<=0){
System.err.println(“沒(méi)有了”);
return;
}
if(obj!=null&&obj.getGift().getAndDecrement()>0){
System.err.println(“搶到一個(gè)紅包”);
count.getAndIncrement();
}
Thread.sleep(500);//模仿處理其他操作
}catch(Exceptione){
e.printStackTrace();
}
}
}

文章標(biāo)簽:

Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)

與項(xiàng)目經(jīng)理交流
掃描二維碼
與項(xiàng)目經(jīng)理交流
掃描二維碼
與項(xiàng)目經(jīng)理交流
ciya68