多线程编程之存钱与取钱

编程技术  /  houtizong 发布于 3年前   176
 

生活费问题是这样的:学生每月都需要生活费,家长一次预存一段时间的生活费,家长和学生使用统一的一个帐号,在学生每次取帐号中一部分钱,直到帐号中没钱时 通知家长存钱,而家长看到帐户还有钱则不存钱,直到帐户没钱时才存钱。

 

问题分析:首先问题中有三个实体,学生、家长、银行账户,所以设计程序时就要设计三个类。其中银行账户只有一个,学生和家长操作的是同一个银行账户,学生的行为是随机不定的,即取钱的操作是随机不定的,这里可以把学生设计成一个线程类。家长呢?

 

Java实现过程如下:

package thread.money;/** * 银行账户 * @author zhoufy */public class Account {private int money; //银行账户中的钱/** * 查询账户里的钱 * @return */public int getMoney(){return money;}/** * 取钱--一次性取完 * @return */public int getAllMoney() {money = 0;return money;}/** * 取钱--取特定金额的钱 * @return */public int getMoney(int m){if(m<=money){money = money - m;return m;}else{return getAllMoney();}}/** * 存钱 * @param money */public void setMoney(int money) {this.money = this.money + money;}}

 

 

package thread.money;import org.apache.commons.lang.math.RandomUtils;/** * 家长 * @author zhoufy */public class Parents {private Account account;/** * 告知银行账户 * @param a */public void tellAccount(Account a){account = a;}/** * 存钱 */public void addAccountMoney(){if(account.getMoney()<=0){int money = RandomUtils.nextInt(1000);account.setMoney(money);//存钱操作System.out.println("家长存入"+money+"元钱!");}}}

 

 

 

package thread.money;import org.apache.commons.lang.math.RandomUtils;public class Student implements Runnable{private Parents parents;private Account account;/** * 构造子函数 */public Student(Parents p){parents = p;}/** * 告知银行账户 * @param a */public void tellAccount(Account a){account = a;}@Overridepublic void run() {int count = 20;do{try {//随机休息Thread.sleep(RandomUtils.nextInt(10));if(account.getMoney()<=0){//如果账户里没钱了,则通知家长要存钱了System.out.println("账户里没有钱~~~,通知家长存钱");parents.addAccountMoney();}else{//随机取钱int rMoney = RandomUtils.nextInt(account.getMoney())+1;int getMoney = account.getMoney(rMoney);System.out.println("学生取出"+getMoney+"元钱,账户还剩余"+account.getMoney()+"元钱噢~~~");}count--;} catch (InterruptedException e) {e.printStackTrace();}}while(count>0);}}

 

package thread.money;public class Main {public static void main(String[] args){//创建银行账户Account account = new Account();//创建家长Parents p = new Parents();p.tellAccount(account);  //家长拥有该银行账户//创建学生Student s = new Student(p);s.tellAccount(account); //学生知道了该银行账户,以后可以取钱了new Thread(s).start(); //让学生动起来吧}}

 

运行结果:
账户里没有钱~~~,通知家长存钱
家长存入339元钱!
学生取出81元钱,账户还剩余258元钱噢~~~
学生取出146元钱,账户还剩余112元钱噢~~~
学生取出85元钱,账户还剩余27元钱噢~~~
学生取出14元钱,账户还剩余13元钱噢~~~
学生取出2元钱,账户还剩余11元钱噢~~~
学生取出8元钱,账户还剩余3元钱噢~~~
学生取出2元钱,账户还剩余1元钱噢~~~
学生取出1元钱,账户还剩余0元钱噢~~~
账户里没有钱~~~,通知家长存钱
家长存入452元钱!
学生取出139元钱,账户还剩余313元钱噢~~~
学生取出271元钱,账户还剩余42元钱噢~~~
学生取出15元钱,账户还剩余27元钱噢~~~
学生取出17元钱,账户还剩余10元钱噢~~~
学生取出7元钱,账户还剩余3元钱噢~~~
学生取出3元钱,账户还剩余0元钱噢~~~
账户里没有钱~~~,通知家长存钱
家长存入528元钱!
学生取出484元钱,账户还剩余44元钱噢~~~
学生取出8元钱,账户还剩余36元钱噢~~~
学生取出32元钱,账户还剩余4元钱噢~~~


说明:
其实这里我有点偷懒,我把家长这个角色设计成了普通的实体类,对于题目要求是多线程编程,那其实上面的编程没有达到题目要求,应该把家长这个类也设计成线程类,试想如何把家长类设计成线程类,结果又会怎样呢?


参考资料:
http://www.cnblogs.com/springcsc/archive/2009/12/03/1616394.html

 

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客