java 使用线程做一个简单的ATM存取款实例.

好久,没写代码了, 利用多余的时间,写一个简单的多线程例子,巩固一下,以前学习的多线程知识..

 

 

线程 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元

 

 

你可能感兴趣的:(java,多线程,thread)