マルチスレッドプログラミングの貯金と引き出し



生活費の問題は、学生は毎月生活費が必要で、保護者は一度に一定の時間の生活費を貯金し、保護者と学生は統一された口座番号を使って、学生が口座番号の一部を取るたびに、口座番号にお金がないまで保護者に貯金を通知し、保護者は口座がまだお金があるのを見て貯金しないで、口座にお金がないまで貯金しない. 
問題分析:まず問題には3つのエンティティがあり、学生、保護者、銀行口座があるので、プログラムを設計するときは3つのクラスを設計しなければならない.このうち銀行口座は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