生活费问题是这样的:学生每月都需要生活费,家长一次预存一段时间的生活费,家长和学生使用统一的一个帐号,在学生每次取帐号中一部分钱,直到帐号中没钱时 通知家长存钱,而家长看到帐户还有钱则不存钱,直到帐户没钱时才存钱。
问题分析:首先问题中有三个实体,学生、家长、银行账户,所以设计程序时就要设计三个类。其中银行账户只有一个,学生和家长操作的是同一个银行账户,学生的行为是随机不定的,即取钱的操作是随机不定的,这里可以把学生设计成一个线程类。家长呢?
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; } @Override public 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
相关推荐
### 嵌入式Linux多线程编程实验知识点解析 #### 一、Fibonacci(斐波那契)序列多线程生成实验 **实验背景与目标:** 本实验旨在利用多线程技术,在嵌入式Linux环境下生成斐波那契数列。通过此实验,学生能够加深...
最后,我们可以创建多个 Customer 对象,每个对象都可以独立地执行存钱或取钱操作,以模拟多线程同步问题的解决方案。 ```java public static void main(String[] args) { Bank bank = new Bank(); Customer ...
首先,多线程是现代计算机程序设计中的一个重要概念,特别是在性能和响应时间方面有高要求的应用中。C#提供了丰富的线程支持,通过`System.Threading`命名空间中的类,如`Thread`和`Task`,使得开发者能够创建和管理...
在本实验中,我们主要探讨了Java多线程的同步机制以及其在并发编程中的应用。实验目的是理解和掌握并行/并发、同步/异步的概念,并通过实现一个模拟银行账户的程序来具体应用这些概念。 首先,理解并行/并发是关键...
这种系统可以帮助开发者学习Java语言的多线程编程和同步机制。 多线程编程 在Java实现银行存取款系统中,使用了多线程编程来模拟多个用户同时进行存取款操作。多线程编程可以提高系统的并发性和响应速度。Java语言...
1、模拟公司会计与出纳行为,会记收账并往公司账户存钱,出纳从公司同一账户取钱用于开支,假定公司只有一个出纳和一个会计。编程实现会计与出纳行为。 2、不采取同步措施情况下,记录会计与出纳分别对账户进行一次...
生产者与消费者问题是操作系统中经典的进程同步问题,它模拟了多线程环境下资源的共享与协作。在这个案例中,我们以会计与出纳的工作过程为例,来解释这个问题的解决策略。 首先,会计与出纳分别代表了生产者和消费...
9. **多线程编程**:在并发环境下,多线程编程可能用于处理多个用户请求,确保系统高效运行。 10. **测试与调试**:源代码中可能包含了单元测试、集成测试等代码,用于验证系统的正确性。 通过深入学习这个...
9. **多线程**:如果ATM模拟软件设计为支持多用户同时操作,可能需要使用到多线程技术,如POSIX线程库(pthread)。 10. **移植性**:由于C语言的跨平台特性,编写好的ATM模拟软件可以很容易地在不同的操作系统上...
7. **多线程**:考虑到银行系统的并发访问需求,多线程技术可能被用来处理多个客户请求,提高系统的响应速度。 8. **设计模式**:为了实现可扩展性和代码复用,开发者可能运用了如单例模式(Singleton)来管理...
Java 线程通信是指在 Java 编程语言中,多个线程之间如何进行交流和协作的机制。Java 提供了多种机制来实现线程间的通信,包括使用 wait()、notify() 和 notifyAll() 方法,使用同步锁和 volatile 变量等。 在 Java...
当账户中没有存款时,取钱方法会阻塞,直到有人存钱进去时,Condition 的 await() 方法会让线程等待,直到有人存钱进去时,signal() 方法会唤醒等待的线程,然后继续执行取钱操作。 使用 Condition 控制线程通信的...
在ATM机程序中,设计了一个名为`ATM1`的类,该类包含了模拟ATM机所需的各种功能,如修改密码、重新登录、存钱、取钱等。这些功能通过静态方法实现,因为在这个实训项目中,所有的ATM机操作都是基于全局状态进行的,...
本文件主要用到的mysql和多线程编程,运用网络编程,实现银行业务办理,其主要的有功能有1、 关于实现的功能:本次实验我主要实现了有以下功能: 1) 职工注册和登录2) 开户3) 销户4) 存钱5) 取钱6) 转账7) ...
ATM存钱取钱案例剖析 模块定义、导入、优化详解 内置模块详解之time与datetime模块 内置模块详解之Range模块 内置模块详解之OS模块 内置模块详解之Sys模块 内置模块详解之Shelve模块 内置模块详解之Xml模块 内置模块...
6. **并发与多线程**: - 在实际银行系统中,可能会涉及到多线程,以处理多个客户的交易请求。但在大一学生的设计项目中,这可能是进阶话题,可能不会涉及。 7. **安全性**: - 虽然简单的银行系统可能不强调安全...
8. **多线程编程**:在大型系统中,多线程技术用于提升程序并发处理能力。例如,后台任务可能在用户交互的同时进行数据同步或计算,提高系统效率。 9. **设计模式**:银行系统可能会采用如单例模式(Singleton)来...
4. **线程安全**:由于ATM系统涉及到资金交易,因此需要确保多用户并发访问的安全性。线程同步和锁机制,如Mutex、Semaphore、Monitor等,是防止数据冲突的关键。 5. **异常处理**:为了提高系统的稳定性和用户体验...
- 定义`Account`类,包含id、name和money属性,以及相应的构造器、存钱(saveMoney)、取钱(withDrawMoney)方法,setter和getter以及toString方法。 - `VipAccount`类继承`Account`,增加大额取款...
存钱和取钱是ATM的主要功能。存款操作需要增加用户的账户余额,而取款操作需要检查余额是否足够,如果足够则减少余额,否则抛出异常。这些操作都需要考虑到并发控制,以防止多线程环境下出现数据不一致的问题,可以...