`
周凡杨
  • 浏览: 234288 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多线程编程之存钱与取钱

阅读更多
 

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

 

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

 

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

 

 

1
0
分享到:
评论
2 楼 fei229670104 2015-07-08  
liujiafei_2007 写道
你好,问个问题,取钱时不用判断取出的金额是否大于账户的余额吗?

取款金额大于卡中金额则会全部取出
1 楼 liujiafei_2007 2015-07-07  
你好,问个问题,取钱时不用判断取出的金额是否大于账户的余额吗?

相关推荐

    实验二 嵌入式Linux多线程编程实验

    ### 嵌入式Linux多线程编程实验知识点解析 #### 一、Fibonacci(斐波那契)序列多线程生成实验 **实验背景与目标:** 本实验旨在利用多线程技术,在嵌入式Linux环境下生成斐波那契数列。通过此实验,学生能够加深...

    以银行取钱为例模拟Java多线程同步问题完整代码

    最后,我们可以创建多个 Customer 对象,每个对象都可以独立地执行存钱或取钱操作,以模拟多线程同步问题的解决方案。 ```java public static void main(String[] args) { Bank bank = new Bank(); Customer ...

    C# 多线程银行账户存取简单模拟(未涉及并发互斥)

    首先,多线程是现代计算机程序设计中的一个重要概念,特别是在性能和响应时间方面有高要求的应用中。C#提供了丰富的线程支持,通过`System.Threading`命名空间中的类,如`Thread`和`Task`,使得开发者能够创建和管理...

    使用Java多线程的同步机制编写应用程序.docx

    在本实验中,我们主要探讨了Java多线程的同步机制以及其在并发编程中的应用。实验目的是理解和掌握并行/并发、同步/异步的概念,并通过实现一个模拟银行账户的程序来具体应用这些概念。 首先,理解并行/并发是关键...

    Java实现银行存取款

    这种系统可以帮助开发者学习Java语言的多线程编程和同步机制。 多线程编程 在Java实现银行存取款系统中,使用了多线程编程来模拟多个用户同时进行存取款操作。多线程编程可以提高系统的并发性和响应速度。Java语言...

    多进程(线程)并发执行

    1、模拟公司会计与出纳行为,会记收账并往公司账户存钱,出纳从公司同一账户取钱用于开支,假定公司只有一个出纳和一个会计。编程实现会计与出纳行为。 2、不采取同步措施情况下,记录会计与出纳分别对账户进行一次...

    生产者与消费者问题(进程同步,会计与出纳问题)含完整课程设计报告

    生产者与消费者问题是操作系统中经典的进程同步问题,它模拟了多线程环境下资源的共享与协作。在这个案例中,我们以会计与出纳的工作过程为例,来解释这个问题的解决策略。 首先,会计与出纳分别代表了生产者和消费...

    webservice银行取款机(SQL版)源代码

    9. **多线程编程**:在并发环境下,多线程编程可能用于处理多个用户请求,确保系统高效运行。 10. **测试与调试**:源代码中可能包含了单元测试、集成测试等代码,用于验证系统的正确性。 通过深入学习这个...

    ATM模拟软。C语言

    9. **多线程**:如果ATM模拟软件设计为支持多用户同时操作,可能需要使用到多线程技术,如POSIX线程库(pthread)。 10. **移植性**:由于C语言的跨平台特性,编写好的ATM模拟软件可以很容易地在不同的操作系统上...

    用java写的银行取款系统 界面很特别啊

    7. **多线程**:考虑到银行系统的并发访问需求,多线程技术可能被用来处理多个客户请求,提高系统的响应速度。 8. **设计模式**:为了实现可扩展性和代码复用,开发者可能运用了如单例模式(Singleton)来管理...

    深入理解Java 线程通信

    Java 线程通信是指在 Java 编程语言中,多个线程之间如何进行交流和协作的机制。Java 提供了多种机制来实现线程间的通信,包括使用 wait()、notify() 和 notifyAll() 方法,使用同步锁和 volatile 变量等。 在 Java...

    Java使用Condition控制线程通信的方法实例详解

    当账户中没有存款时,取钱方法会阻塞,直到有人存钱进去时,Condition 的 await() 方法会让线程等待,直到有人存钱进去时,signal() 方法会唤醒等待的线程,然后继续执行取钱操作。 使用 Condition 控制线程通信的...

    经典java编程及java实训报告.pdf

    在ATM机程序中,设计了一个名为`ATM1`的类,该类包含了模拟ATM机所需的各种功能,如修改密码、重新登录、存钱、取钱等。这些功能通过静态方法实现,因为在这个实训项目中,所有的ATM机操作都是基于全局状态进行的,...

    银行管理系统(C++)

    本文件主要用到的mysql和多线程编程,运用网络编程,实现银行业务办理,其主要的有功能有1、 关于实现的功能:本次实验我主要实现了有以下功能: 1) 职工注册和登录2) 开户3) 销户4) 存钱5) 取钱6) 转账7) ...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    ATM存钱取钱案例剖析 模块定义、导入、优化详解 内置模块详解之time与datetime模块 内置模块详解之Range模块 内置模块详解之OS模块 内置模块详解之Sys模块 内置模块详解之Shelve模块 内置模块详解之Xml模块 内置模块...

    银行系统(存取款,排队)C/C++

    6. **并发与多线程**: - 在实际银行系统中,可能会涉及到多线程,以处理多个客户的交易请求。但在大一学生的设计项目中,这可能是进阶话题,可能不会涉及。 7. **安全性**: - 虽然简单的银行系统可能不强调安全...

    用C#编写的银行系统

    8. **多线程编程**:在大型系统中,多线程技术用于提升程序并发处理能力。例如,后台任务可能在用户交互的同时进行数据同步或计算,提高系统效率。 9. **设计模式**:银行系统可能会采用如单例模式(Singleton)来...

    ATM机取款系统

    4. **线程安全**:由于ATM系统涉及到资金交易,因此需要确保多用户并发访问的安全性。线程同步和锁机制,如Mutex、Semaphore、Monitor等,是防止数据冲突的关键。 5. **异常处理**:为了提高系统的稳定性和用户体验...

    Java基础综合技能练习题一.docx

    - 定义`Account`类,包含id、name和money属性,以及相应的构造器、存钱(saveMoney)、取钱(withDrawMoney)方法,setter和getter以及toString方法。 - `VipAccount`类继承`Account`,增加大额取款...

    模拟ATM

    存钱和取钱是ATM的主要功能。存款操作需要增加用户的账户余额,而取款操作需要检查余额是否足够,如果足够则减少余额,否则抛出异常。这些操作都需要考虑到并发控制,以防止多线程环境下出现数据不一致的问题,可以...

Global site tag (gtag.js) - Google Analytics