生活费问题是这样的:学生每月都需要生活费,家长一次预存一段时间的生活费,家长和学生使用统一的一个帐号,在学生每次取帐号中一部分钱,直到帐号中没钱时 通知家长存钱,而家长看到帐户还有钱则不存钱,直到帐户没钱时才存钱。
问题分析:首先问题中有三个实体,学生、家长、银行账户,所以设计程序时就要设计三个类。其中银行账户只有一个,学生和家长操作的是同一个银行账户,学生的行为是随机不定的,即取钱的操作是随机不定的,这里可以把学生设计成一个线程类。家长呢?
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