查看本章节

查看作业目录


需求说明:

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

实现思路:

  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();
} }

最新文章

  1. Radmin Center 1.54 测试版
  2. 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并
  3. Halcon 10.0:Sample 分割边缘拟合圆Circles.hdev
  4. C语言中的转义字符
  5. Help Me Escape (ZOJ 3640)
  6. c# 调用 ShellExecute
  7. 基于Hash算法的高维数据的最近邻检索
  8. (转)DES、RSA、MD5、SHA、随机生成加密与解密
  9. Mysql Explain 详解
  10. java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别(转)
  11. ListView的操作模式的选择的更详细的解释CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL
  12. ASP.NET MVC (Razor)开发
  13. Python笔记1-20151021
  14. Docker系列02—LXC---Docker的“前身”
  15. 洛谷P3038 [USACO11DEC]牧草种植Grass Planting
  16. Flask请求request
  17. 【mysql】mysql触发器使用示例
  18. bzoj 1818 [CQOI 2010] 内部白点 - 扫描线 - 树状数组
  19. linux常用命令:ln 命令
  20. [转帖]Cgroups 与 Systemd

热门文章

  1. SpringAOP浅析
  2. shiro免认证的路径配置
  3. jQuery对象进行方法扩展
  4. 使用OPC与PLC通讯 一
  5. 腾讯新闻基于 Flink PipeLine 模式的实践
  6. &lt;转&gt;Android多线程总结
  7. Redis篇:持久化、淘汰策略,缓存失效策略
  8. jdk1.8安装教程
  9. oracle11gR2、client及plsql完整安装与配置
  10. response 返回js的alert()语句,中文乱码如何解决