摘要:業(yè)務(wù)分析要完成搶紅包的功能重點(diǎn)有兩個(gè)多線程并發(fā)修改數(shù)據(jù)紅包現(xiàn)金分配算法類(lèi)設(shè)計(jì)用戶(hù)對(duì)象包含用戶(hù)名稱(chēng),所搶到的金額,最后的提示文言字段搶紅包的用戶(hù)用戶(hù)昵稱(chēng)用戶(hù)搶到的金額用戶(hù)獲得系統(tǒng)提示文言并發(fā)訪問(wèn)的共享紅包對(duì)象這個(gè)對(duì)象包含了預(yù)分配的所有小紅包并
【業(yè)務(wù)分析
要完成搶紅包的功能重點(diǎn)有兩個(gè):
多線程并發(fā)修改數(shù)據(jù)
紅包現(xiàn)金分配算法
【類(lèi)設(shè)計(jì)用戶(hù)對(duì)象:包含用戶(hù)名稱(chēng),所搶到的金額,最后的提示文言字段
package com.xz.core; /** * 搶紅包的用戶(hù) * @author ibm */ public class User { /** * 用戶(hù)昵稱(chēng) */ private String name; /** * 用戶(hù)搶到的金額 */ private int money; /** * 用戶(hù)獲得系統(tǒng)提示文言 */ private String info; public User(String name, int money, String info) { this.name = name; this.money = money; this.info = info; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getMoney() { return money; } public void setMoney(int money) { this.money = money; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }
并發(fā)訪問(wèn)的共享紅包對(duì)象:這個(gè)對(duì)象包含了預(yù)分配的所有小紅包并提供并發(fā)控制,用戶(hù)線程只能通過(guò)這個(gè)類(lèi)獲得紅包
package com.xz.core; import java.util.List; public class Moneys { /** * 預(yù)分配的紅包金額 */ Listmoneys; Moneys(List moneys){ this.moneys = moneys; } /** * 獲得紅包,如果一個(gè)用戶(hù)獲得了紅包,改紅包將從紅包集合中移除 * @return 紅包金額 */ public synchronized Integer getMoney(){ if(moneys.size() <= 0){ return 0; } int money = moneys.get(0); moneys.remove(0); return money; } }
用戶(hù)線程:
class GrabRedEnvelopeThread implements Runnable{ /** * 該線程持有的用戶(hù)對(duì)象 */ private User user; /** * 所有線程共享的與分配金額 */ private Moneys moneys; GrabRedEnvelopeThread(User user,Moneys moneys){ this.user = user; this.moneys = moneys; } @Override public void run() { try { int myMoney = moneys.getMoney(); user.setMoney(myMoney); if(myMoney > 0){ user.setInfo(user.getName() + " 獲得 " +myMoney); }else { user.setInfo(user.getName() + " 沒(méi)搶到"); } } catch (Exception e) { e.printStackTrace(); } } }
紅包金額分配算法:相當(dāng)簡(jiǎn)陋的實(shí)現(xiàn):
/** * 獲取隨機(jī)的紅包金額 * @param number 紅包數(shù)量 * @param money 紅包金額 * @return 隨機(jī)紅包 */ private Moneys getRandomMoney(int number,int money){ Listmoneys = new ArrayList<>(); int averageMoney = money / number; for (int i = 0; i < number; i++) { if(i == (number - 1)){ moneys.add(money - moneys.stream().mapToInt(m -> m.intValue()).sum()); }else { moneys.add((int)(Math.random() * averageMoney +1)); } } if(moneys.size() != number){ System.out.println("nq"); } return new Moneys(moneys); }
代碼模擬器:用于測(cè)試的客戶(hù)端
import java.util.*; import java.util.concurrent.CompletableFuture; /** * 搶紅包模擬器 * @author ibm */ @SuppressWarnings("all") public class BusinessSimulator { /** * 用戶(hù)群 */ private List【結(jié)果users = Arrays.asList(new User("王一",0,""), new User("牛二",0,""), new User("張三",0,""), new User("李四",0,""), new User("吳五",0,""), new User("趙六",0,""), new User("枸七",0,"")); /** * 發(fā)出的金額 */ private int money = 100; /** * 紅包數(shù)量 */ private int number = 3; public static void main(String[] args) throws InterruptedException { BusinessSimulator simulator = new BusinessSimulator(); simulator.grabRedEnvelope(simulator.users,simulator.money,simulator.number); simulator.users.forEach(u -> { System.out.println(u.getInfo()); }); } /** * 搶紅包方法 * @param users 用戶(hù)群 * @param money 發(fā)出的金額 * @param number 紅包數(shù)量 * @return 用戶(hù)搶到紅包集合 */ private List grabRedEnvelope(List users,int money,int number) throws InterruptedException { //預(yù)分配金額 Moneys moneys = getRandomMoney(number, money); List futures = new ArrayList<>(); for (int index = 0; index < users.size(); index++) { Runnable run = new GrabRedEnvelopeThread(users.get(index),moneys); futures.add(CompletableFuture.runAsync(run)); } CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join(); return users; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68686.html
摘要:探究系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)后端掘金驗(yàn)證碼生成類(lèi)手把手教程后端博客系統(tǒng)第一章掘金轉(zhuǎn)眼間時(shí)間就從月份到現(xiàn)在的十一月份了。提供了與標(biāo)準(zhǔn)不同的工作方式我的后端書(shū)架后端掘金我的后端書(shū)架月前本書(shū)架主要針對(duì)后端開(kāi)發(fā)與架構(gòu)。 Spring Boot干貨系列總綱 | 掘金技術(shù)征文 - 掘金原本地址:Spring Boot干貨系列總綱博客地址:http://tengj.top/ 前言 博主16年認(rèn)識(shí)Spin...
摘要:春節(jié)搶票應(yīng)該是每個(gè)在外游子的必修課,還有不足一個(gè)月就要過(guò)春節(jié)了,現(xiàn)在的你,是不是還奮戰(zhàn)在搶票一線呢說(shuō)到搶票,之所以現(xiàn)在大家能享受到流暢的移動(dòng)互聯(lián)網(wǎng)購(gòu)票服務(wù),其實(shí)背后都是云計(jì)算在加持,沒(méi)想到吧,原來(lái)看似高深的云計(jì)算離我們?nèi)绱酥4汗?jié)搶票應(yīng)該是每個(gè)在外游子的必修課,還有不足一個(gè)月就要過(guò)春節(jié)了,現(xiàn)在的你,是不是還奮戰(zhàn)在搶票一線呢?說(shuō)到搶票,之所以現(xiàn)在大家能享受到流暢的移動(dòng)互聯(lián)網(wǎng)購(gòu)票服務(wù),其實(shí)背后...
摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見(jiàn)它的使用,在開(kāi)始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話(huà),看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽(tīng)名字多牛逼,來(lái),我們一步一步來(lái)?yè)羝魄皟蓚€(gè)名詞,今天我們首先來(lái)說(shuō)說(shuō)分布式。 探究...
摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見(jiàn)它的使用,在開(kāi)始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話(huà),看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽(tīng)名字多牛逼,來(lái),我們一步一步來(lái)?yè)羝魄皟蓚€(gè)名詞,今天我們首先來(lái)說(shuō)說(shuō)分布式。 探究...
摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見(jiàn)它的使用,在開(kāi)始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話(huà),看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽(tīng)名字多牛逼,來(lái),我們一步一步來(lái)?yè)羝魄皟蓚€(gè)名詞,今天我們首先來(lái)說(shuō)說(shuō)分布式。 探究...
閱讀 3009·2021-10-08 10:18
閱讀 729·2019-08-30 15:54
閱讀 1061·2019-08-29 18:43
閱讀 2433·2019-08-29 15:33
閱讀 1298·2019-08-29 15:29
閱讀 1598·2019-08-29 13:29
閱讀 1022·2019-08-26 13:46
閱讀 1692·2019-08-26 11:55