使用ThreadLocal類,項目中創建賬戶類Account

需求說明:

某用戶共有兩張銀行卡,賬戶名稱相同,但卡號和餘額不同。模擬用戶使用這兩張銀行卡進行消費的過程,並打印出消費明細

實現思路:

  1. 項目中創建賬戶類 Account,類中包括賬戶名稱name、 ThreadLocal 類的引用變量amount,表示存款
  2. 創建消費類 DailyConsmption實現Runnable 接 口。聲明 賬戶類型的引用 account, 使 用new Random() 實例化一個隨機類對象 random,並定義一個初始化賬戶的構造方法
  3. 在run方法中調用 account 對象的setAmount存款方法,產生隨機數表示存款金額,聲明 double 類型的變量 consumptionAmount 和balance,分別表示每次的消費金額和銀行卡餘額
  4. 使用for循環模擬消費5次,判斷餘額是否大於等於 0,如果餘額小於 0,則提示用戶餘額不足,不夠此次消費,並結束循環。若餘額大於等於 0,則輸出此次的消費明細(包括賬號名稱、線程名稱、消費金額和銀行卡餘額)
  5. 創建測試類,創建兩個線程進行測試

實現代碼:

賬戶類 Account

public class Account {
    //賬號名稱
    private String name;
    //定義一個ThreadLocal類型的變量,該變量將是線程的局部變量,用來保存不同銀行卡的存款
    private ThreadLocal<Double> amount = new ThreadLocal<>();
    //構造方法
    public Account() {
        super();
    }
    public Account(String name) {
        super();
        this.name = name;
    }
    //通過ThreadLocal類的get()方法返回線程局部變量值
    public Double getAmount() {
        return amount.get();
    }
    //通過ThreadLocal類的set()方法設置線程局部變量值
    public void setAmount(Double amount) {
        this.amount.set(amount);;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}

消費類 DailyConsmption

import java.util.Random;
 
public class DailyConsmption implements Runnable {
 
    private Account account;
    Random random = new Random();
    
    public DailyConsmption(Account account) {
        this.account = account;
    }
    
    @Override
    public void run() {
        //設置銀行卡存款
        account.setAmount((double)random.nextInt((2000)+100));
        System.out.println(account.getName()+"的"+Thread.currentThread().getName()+"銀行卡,存款"+account.getAmount()+"元");
        //聲明消費金額變量 comsumptionAmount
        double consumptionAmount = 0.0;
        //聲明保存餘額的變量
        double balance = 0.0;
        //模擬賬戶消費5次
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //隨機生成一個消費金額
            consumptionAmount = random.nextInt(((100)+1));
            //消費完成之後的金額
            balance = account.getAmount() - consumptionAmount;
            if (balance >= 0) {
                System.out.println(account.getName()+"的"+Thread.currentThread().getName()+"銀行卡消費了"+account.getAmount()+"元,餘額"+balance+"元");
                account.setAmount(balance);
            } else {
                System.out.println(account.getName()+"的"+Thread.currentThread().getName()+"銀行卡餘額只剩"+account.getAmount()+"元,不夠支付"+consumptionAmount+"元");
                break;
            }
        }
    }
 
}

測試類 TestConsmption

public class TestConsmption {
   public static void main(String[] args) {
       //實例化account對象
       Account account = new Account("張三");
       //實例化Runnable對象
       DailyConsmption consmption = new DailyConsmption(account);
       //創建並啓動兩條線程
       new Thread(consmption,"6222 5555 0022 2200").start();
       new Thread(consmption,"6222 5555 8899 1177").start();
   }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章