当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

多线程编程之存钱与取钱

发表于: 2015-07-06   作者:周凡杨   来源:转载   浏览:
摘要:   生活费问题是这样的:学生每月都需要生活费,家长一次预存一段时间的生活费,家长和学生使用统一的一个帐号,在学生每次取帐号中一部分钱,直到帐号中没钱时 通知家长存钱,而家长看到帐户还有钱则不存钱,直到帐户没钱时才存钱。   问题分析:首先问题中有三个实体,学生、家长、银行账户,所以设计程序时就要设计三个类。其中银行账户只有一个,学生和家长操作的是同一个银行账户,学生的行为是
 

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

 

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

 

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

 

 

多线程编程之存钱与取钱

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一,什么是线程同步? 同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。这里的同
一,线程的特性 1,随机性,系统在执行多线程程序时只保证线程是交替执行的,至于哪个线程先执行哪
目录(?)[-] iOS多线程编程之NSThread的使用 使用 NSOperation的方式有两种, 一种是用定义好的两个
前一篇 《iOS多线程编程之NSThread的使用》 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperat
使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOper
1、简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.、NSThread 2、Cocoa NSOperation (iOS多线
1、简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.、NSThread 2、Cocoa NSOperation (iOS多线
CreatThread函数如下图所示 在这里我们只用到了第三个和第四个参数,第三个参数传递了一个函数的地
1、简介: 1.1 iOS有三种多线程编程的技术,分别是: 1.、NSThread 2、Cocoa NSOperation (iOS多线
前一篇 《iOS多线程编程之NSThread的使用》 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperat
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号