查看本章节

查看作业目录


需求说明:

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

实现思路:

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

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

  1. 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。

    需求说明: 模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员.教练员包括乒乓球教练和篮球教练.为了方便出国交流,根乒乓球相关的人员都需要学习英语.具体分析如下: (1)共同的属性 ...

  2. 编写Java程序,读取文本文档的内容,去除文本中包含的“广告”字样,把更改后的内容保存到一个新的文本文档中

    查看本章节 查看作业目录 需求说明: 读取文本文档的内容,去除文本中包含的"广告"字样,把更改后的内容保存到一个新的文本文档中 实现思路: 在main() 方法中,使用 new F ...

  3. 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n

      35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...

  4. Java初学者作业——编写 Java 程序,定义 Employee 类以及 HR 类,实现 HR 为 Employee 加薪的功能。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,定义 Employee 类以及 HR 类,实现 HR 为 Employee 加薪的功能. 实现思路: 定义 Employee 类,并定义属性 ...

  5. Java初学者作业——编写 Java 程序,定义 Java 类 (Point) 用来表示坐标,坐标范围在(0,0)到(100,100)以内,并显示合法的坐标在控制台。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,定义 Java 类 Point 用来表示坐标,坐标范围在(0,0)到(100,100)以内,并显示合法的坐标在控制台. 实现思路: 定义 P ...

  6. 初学编写JAVA程序

    一.编写JAVA程序 编写JAVA程序,输出一行文本信息:“Hello world”,选择编辑器eclipse,打开之后编写程序 public class Hello{ public static v ...

  7. Java初学者作业——编写 Java 程序,用户输入 3 个操作数,分别求出最大值、最小值和平均值。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,用户输入 3 个操作数,分别求出最大值.最小值和平均值. 实现思路: 定义 Java 类,定义 3 个方法,用来求 3 个数字的最大值.最小 ...

  8. 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book)、一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户,使用简单工厂模式模拟这一过程。

    查看本章节 查看作业目录 需求说明: 编写Java程序,用户在网上购买商品(good),当用户买了一本书(book).一顶帽子(hat)或者买了一双鞋子(shoe),卖家就会通过物流将商品邮寄给用户, ...

  9. Java初学者作业——编写JAVA程序,计算跳水运动员本次动作的最终得分。

    返回本章节 返回作业目录 需求说明: 编写JAVA程序,计算跳水运动员本次动作的最终得分. 规则如下: 在跳水比赛中,共有六位裁判对运动员所完成的动作进行评分,每位裁判的评分在0-10之间,运动员最终 ...

随机推荐

  1. 转 MessageDigest来实现数据加密

    转自 https://www.cnblogs.com/androidsuperman/p/10296668.html MessageDigest MessageDigest 类为应用程序提供信息摘要算 ...

  2. Apache架构师的30条设计原则

    本文作者叫 Srinath,是一位科学家,软件架构师,也是一名在分布式系统上工作的程序员. 他是 Apache Axis2 项目的联合创始人,也是 Apache Software 基金会的成员. 他是 ...

  3. 小程序中使用less(最优方式)

    写惯了less/sass,但是现在开发小程序缺还是css,很不习惯. 在网上搜的教程,要么是gulp,要么就是vscode的Easy-less的插件. 传统方式 我们来对比,这两种方式的优劣. Gul ...

  4. js和jquery之间的转换

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 『与善仁』Appium基础 — 20、Appium元素定位

    目录 1.by_id定位 2.by_name定位 3.by_class_name定位 4.by_xpath定位 5.by_accessibility_id定位 6.by_android_uiautom ...

  6. Redis主从 部署和配置

    目录 一.主从简介 主从介绍 主从原理 二.主从部署 环境介绍 主从配置 临时主从 三.主从测试 一.主从简介 主从介绍 Redis都是主节点.每个从节点只能有一个主节点,而主节点可以同时具有多个从节 ...

  7. thinkphp引入PHPExcel类---thinkPHP类库扩展-----引入没有采用命名空间的类库

    最近项目中遇到引入PHPExcel第三方类库 但是下载的phpExcel类没有命名空间,而且所有接口文件的命名都是以.php结尾  而不是tp中的.class.php 解决办法很简单:在引入没有采用命 ...

  8. CF1119A Ilya and a Colorful Walk 题解

    Content 有一个长度为 \(n\) 的数组 \(a_1,a_2,a_3,...,a_n\),试求出两个不相等的数之间的距离的最大值. 数据范围:\(3\leqslant n\leqslant 3 ...

  9. CF20B Equation 题解

    Content 解方程 \(ax^2+bx+c=0\). 数据范围:\(-10^5\leqslant a,b,c\leqslant 10^5\). Solution 很明显上求根公式. 先来给大家推推 ...

  10. JVM 常见面试题指南

    基础 1. JDK.JRE.JVM的关系是什么? 什么是 JVM? 英文名称 (Java Virtual Machine ),就是JAVA 虛拟机,它只识别 .class 类型文件,它 能够将 cla ...