java 使用執行緒做一個簡單的ATM存取款例項.

悠悠隱於市發表於2011-02-24

好久,沒寫程式碼了, 利用多餘的時間,寫一個簡單的多執行緒例子,鞏固一下,以前學習的多執行緒知識..

 

 

執行緒 Thread 類,和 Runable 介面 比較兩者的特點和應用領域.

 

可以,直接繼承執行緒Thread類。該方法編寫簡單,可以直接操作執行緒,適用於單重繼承情況,因而不能在繼承其他類

實現Runnable介面。當一個執行緒已繼承了另一個類時,就只能用實現Runnable介面的方法來建立執行緒,且便於保持程式風格的一致性。

 

我們知道,一個具有生命的執行緒,具有下面五種狀態:

 

建立狀態

使用new運算子建立一個執行緒後,該執行緒僅僅是一個空物件,系統沒有分配資源,稱該執行緒處於建立狀態(new thread)

可執行狀態

使用start()方法啟動一個執行緒後,系統為該執行緒分配了除CPU外的所需資源,使該執行緒處於可執行狀態(Runnable)

執行中狀態

Java執行系統通過排程選中一個Runnable的執行緒,使其佔有CPU並轉為執行中狀態(Running)。此時,系統真正執行執行緒的run()方法。

阻塞狀態

一個正在執行的執行緒因某種原因不能繼續執行時,進入阻塞狀態(Blocked)

死亡狀態

執行緒結束後是死亡狀態(Dead)

廢話不多說,下面直接上程式碼:

 

package pack.java.thread.atm;
/**
 * 賬戶類;
 * @author Administrator
 *
 */
public class Account {
	
	private String name;  //使用者名稱;
	private int value;    //賬戶餘額;
	
	/**
	 * 存入金額;
	 * @param monery
	 */
	public void putMonery(int monery){
		this.value = this.value + monery; 
	}
	
	/**
	 * 取出金額;
	 * @param monery
	 * @return 金額;
	 */
	public int getMonery(int monery){
		
		//判斷是否賬戶餘額是否大於 要取出的錢;
		if(this.value > monery ){
			this.value = this.value - monery;	
		}else{
			monery = this.value;  //賬戶餘額不夠時,則取出,所有的賬戶餘額的金額. 
			this.value = 0;
		}
		//返回取出的錢;
		return monery;
	}
	
	/**
	 * 查詢餘額;
	 * @return 返回賬戶餘額;
	 */
	public int search(){
		return this.value;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
}

 

 

 

package pack.java.thread.atm;

import java.io.Serializable;
/**
 * 取款執行緒類;
 * @author Administrator
 *
 */
public class FetchMoney extends Thread implements Serializable{
	
	private static final long serialVersionUID = -5059599151558445815L;

	private Account account;  //賬戶物件;
	private int monery;       //餘額;
	
	public FetchMoney(){
		super();
	}
	
	public FetchMoney(int monery,Account account){
		this.account = account;
		this.monery = monery;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		int currMonery  = account.search();  //當前餘額;
		synchronized (account) {
			try {
				sleep(5);   //取款發費的時間;
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//取出餘額;
			int getMonery = account.getMonery(monery);
			System.out.println("尊敬的"+account.getName()+"使用者您好!"+"當前的餘額為:"+currMonery +"元."+"取出餘額為:"+getMonery+"元."+"賬戶餘額為:"+account.search()+"元");
		}
	}
}

 

 

 

package pack.java.thread.atm;

import java.io.Serializable;

/**
 * 存款執行緒類;
 * @author Administrator
 *
 */
public class SaveMoney extends Thread implements Serializable{

	private static final long serialVersionUID = 3095120546560212724L;
	
	private Account account;  //賬戶物件;
	private int money;        //金額;
	
	public SaveMoney(){
		super();
	}
	
	public SaveMoney(int money,Account account){
		this.account = account;
		this.money = money;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		int currMonery = account.search(); //查詢賬戶餘額;
		
		//同步物件,只允許單執行緒操作;
		synchronized (account) {
			try {
				sleep(5);  //查詢的時候,發費得時間;
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			account.putMonery(this.money);   //插入金額;
			//輸出存款資訊;
			System.out.println("尊敬的"+account.getName()+"使用者您好!"+"當前的餘額為:"+currMonery +"元."+"存入餘額為:"+this.money+"元."+"賬戶餘額為:"+account.search()+"元");
		}
	}
}

 

 

 

package pack.java.thread.atm;
/**
 * ATM測試類;
 * @author Administrator
 *
 */
public class ThreadATMDemo {

	/**
	 * 主方法;
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Account account = new Account();
		//設定使用者名稱;
		account.setName("ZhouHaiTao");
		//初始化餘額;
		account.setValue(0);
		
		//存入100;
		new SaveMoney(100,account).start();
		
		//存入200;
		new SaveMoney(200, account).start();
		
		//取出500;
		new FetchMoney(500, account).start();
	}
}

 

 

 

程式執行結果如下:

 

尊敬的ZhouHaiTao使用者您好!當前的餘額為:0元.存入餘額為:100元.賬戶餘額為:100元
尊敬的ZhouHaiTao使用者您好!當前的餘額為:0元.存入餘額為:200元.賬戶餘額為:300元
尊敬的ZhouHaiTao使用者您好!當前的餘額為:0元.取出餘額為:300元.賬戶餘額為:0元

 

 

相關文章