需求說明:
某用戶共有兩張銀行卡,賬戶名稱相同,但卡號和餘額不同。模擬用戶使用這兩張銀行卡進行消費的過程,並打印出消費明細
實現思路:
- 項目中創建賬戶類 Account,類中包括賬戶名稱name、 ThreadLocal 類的引用變量amount,表示存款
- 創建消費類 DailyConsmption實現Runnable 接 口。聲明 賬戶類型的引用 account, 使 用new Random() 實例化一個隨機類對象 random,並定義一個初始化賬戶的構造方法
- 在run方法中調用 account 對象的setAmount存款方法,產生隨機數表示存款金額,聲明 double 類型的變量 consumptionAmount 和balance,分別表示每次的消費金額和銀行卡餘額
- 使用for循環模擬消費5次,判斷餘額是否大於等於 0,如果餘額小於 0,則提示用戶餘額不足,不夠此次消費,並結束循環。若餘額大於等於 0,則輸出此次的消費明細(包括賬號名稱、線程名稱、消費金額和銀行卡餘額)
- 創建測試類,創建兩個線程進行測試
實現代碼:
賬戶類 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();
}
}