小言_互联网的博客

编写Java程序,使用ThreadLocal类,项目中创建账户类 Account,类中包括账户名称name、 ThreadLocal 类的引用变量amount,表示存款

367人阅读  评论(0)

查看本章节

查看作业目录


需求说明:

某用户共有两张银行卡,账户名称相同,但卡号和余额不同。模拟用户使用这两张银行卡进行消费的过程,并打印出消费明细

实现思路:

  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


  
  1. public class Account {
  2. //账号名称
  3. private String name;
  4. //定义一个ThreadLocal类型的变量,该变量将是线程的局部变量,用来保存不同银行卡的存款
  5. private ThreadLocal<Double> amount = new ThreadLocal<>();
  6. //构造方法
  7. public Account() {
  8. super();
  9. }
  10. public Account(String name) {
  11. super();
  12. this.name = name;
  13. }
  14. //通过ThreadLocal类的get()方法返回线程局部变量值
  15. public Double getAmount() {
  16. return amount.get();
  17. }
  18. //通过ThreadLocal类的set()方法设置线程局部变量值
  19. public void setAmount(Double amount) {
  20. this.amount.set(amount);;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. }

消费类 DailyConsmption


  
  1. import java.util.Random;
  2. public class DailyConsmption implements Runnable {
  3. private Account account;
  4. Random random = new Random();
  5. public DailyConsmption(Account account) {
  6. this.account = account;
  7. }
  8. @Override
  9. public void run() {
  10. //设置银行卡存款
  11. account.setAmount(( double)random.nextInt(( 2000)+ 100));
  12. System.out.println(account.getName()+ "的"+Thread.currentThread().getName()+ "银行卡,存款"+account.getAmount()+ "元");
  13. //声明消费金额变量 comsumptionAmount
  14. double consumptionAmount = 0.0;
  15. //声明保存余额的变量
  16. double balance = 0.0;
  17. //模拟账户消费5次
  18. for ( int i = 0; i < 5; i++) {
  19. try {
  20. Thread.sleep( 500);
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. //随机生成一个消费金额
  25. consumptionAmount = random.nextInt((( 100)+ 1));
  26. //消费完成之后的金额
  27. balance = account.getAmount() - consumptionAmount;
  28. if (balance >= 0) {
  29. System.out.println(account.getName()+ "的"+Thread.currentThread().getName()+ "银行卡消费了"+account.getAmount()+ "元,余额"+balance+ "元");
  30. account.setAmount(balance);
  31. } else {
  32. System.out.println(account.getName()+ "的"+Thread.currentThread().getName()+ "银行卡余额只剩"+account.getAmount()+ "元,不够支付"+consumptionAmount+ "元");
  33. break;
  34. }
  35. }
  36. }
  37. }

测试类 TestConsmption


  
  1. public class TestConsmption {
  2. public static void main(String[] args) {
  3. //实例化account对象
  4. Account account = new Account( "张三");
  5. //实例化Runnable对象
  6. DailyConsmption consmption = new DailyConsmption(account);
  7. //创建并启动两条线程
  8. new Thread(consmption, "6222 5555 0022 2200").start();
  9. new Thread(consmption, "6222 5555 8899 1177").start();
  10. }
  11. }

 


转载:https://blog.csdn.net/weixin_44893902/article/details/108815806
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场