国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java并發編程學習18--最迷你的搶紅包

caohaoyu / 2617人閱讀

摘要:業務分析要完成搶紅包的功能重點有兩個多線程并發修改數據紅包現金分配算法類設計用戶對象包含用戶名稱,所搶到的金額,最后的提示文言字段搶紅包的用戶用戶昵稱用戶搶到的金額用戶獲得系統提示文言并發訪問的共享紅包對象這個對象包含了預分配的所有小紅包并

【業務分析

要完成搶紅包的功能重點有兩個:

多線程并發修改數據

紅包現金分配算法

【類設計

用戶對象:包含用戶名稱,所搶到的金額,最后的提示文言字段

package com.xz.core;

/**
 * 搶紅包的用戶
 * @author ibm
 */
public class User {

    /**
     * 用戶昵稱
     */
    private String name;
    /**
     * 用戶搶到的金額
     */
    private int money;
    /**
     * 用戶獲得系統提示文言
     */
    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;
    }

}

并發訪問的共享紅包對象:這個對象包含了預分配的所有小紅包并提供并發控制,用戶線程只能通過這個類獲得紅包

package com.xz.core;

import java.util.List;

public class Moneys {

    /**
     * 預分配的紅包金額
     */
    List moneys;

    Moneys(List moneys){
        this.moneys = moneys;
    }

    /**
     * 獲得紅包,如果一個用戶獲得了紅包,改紅包將從紅包集合中移除
     * @return 紅包金額
     */
    public synchronized Integer getMoney(){
        if(moneys.size() <= 0){
            return 0;
        }
        int money = moneys.get(0);
        moneys.remove(0);
        return money;
    }
}

用戶線程:

 class GrabRedEnvelopeThread implements Runnable{
        /**
         * 該線程持有的用戶對象
         */
        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() + " 沒搶到");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

紅包金額分配算法:相當簡陋的實現:

/**
     * 獲取隨機的紅包金額
     * @param number 紅包數量
     * @param money 紅包金額
     * @return 隨機紅包
     */
    private Moneys getRandomMoney(int number,int money){
        List moneys = 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);
    }

代碼模擬器:用于測試的客戶端

import java.util.*;
import java.util.concurrent.CompletableFuture;

/**
 * 搶紅包模擬器
 * @author ibm
 */
@SuppressWarnings("all")
public class BusinessSimulator {

    /**
     * 用戶群
     */
    private List users = Arrays.asList(new User("王一",0,""),
            new User("牛二",0,""),
            new User("張三",0,""),
            new User("李四",0,""),
            new User("吳五",0,""),
            new User("趙六",0,""),
            new User("枸七",0,""));
    /**
     * 發出的金額
     */
    private int money = 100;
    /**
     * 紅包數量
     */
    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 用戶群
     * @param money 發出的金額
     * @param number 紅包數量
     * @return 用戶搶到紅包集合
     */
   private List grabRedEnvelope(List users,int money,int number) throws InterruptedException {

        //預分配金額
        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;
    }     
}
【結果

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68686.html

相關文章

  • 后臺 - 收藏集 - 掘金

    摘要:探究系統登錄驗證碼的實現后端掘金驗證碼生成類手把手教程后端博客系統第一章掘金轉眼間時間就從月份到現在的十一月份了。提供了與標準不同的工作方式我的后端書架后端掘金我的后端書架月前本書架主要針對后端開發與架構。 Spring Boot干貨系列總綱 | 掘金技術征文 - 掘金原本地址:Spring Boot干貨系列總綱博客地址:http://tengj.top/ 前言 博主16年認識Spin...

    CrazyCodes 評論0 收藏0
  • 99%的人都不知道春節搶票背后云計算在加持

    摘要:春節搶票應該是每個在外游子的必修課,還有不足一個月就要過春節了,現在的你,是不是還奮戰在搶票一線呢說到搶票,之所以現在大家能享受到流暢的移動互聯網購票服務,其實背后都是云計算在加持,沒想到吧,原來看似高深的云計算離我們如此之近。春節搶票應該是每個在外游子的必修課,還有不足一個月就要過春節了,現在的你,是不是還奮戰在搶票一線呢?說到搶票,之所以現在大家能享受到流暢的移動互聯網購票服務,其實背后...

    megatron 評論0 收藏0
  • 并發

    摘要:表示的是兩個,當其中任意一個計算完并發編程之是線程安全并且高效的,在并發編程中經常可見它的使用,在開始分析它的高并發實現機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯網高并發場景。 干貨:深度剖析分布式搜索引擎設計 分布式,高可用,和機器學習一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...

    supernavy 評論0 收藏0
  • 并發

    摘要:表示的是兩個,當其中任意一個計算完并發編程之是線程安全并且高效的,在并發編程中經常可見它的使用,在開始分析它的高并發實現機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯網高并發場景。 干貨:深度剖析分布式搜索引擎設計 分布式,高可用,和機器學習一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...

    ddongjian0000 評論0 收藏0
  • 并發

    摘要:表示的是兩個,當其中任意一個計算完并發編程之是線程安全并且高效的,在并發編程中經常可見它的使用,在開始分析它的高并發實現機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯網高并發場景。 干貨:深度剖析分布式搜索引擎設計 分布式,高可用,和機器學習一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...

    wangdai 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<