java 使用线程做的一个简单的ATM存取款实例代码
程序员文章站
2023-12-19 20:18:34
实现runnable接口。当一个线程已继承了另一个类时,就只能用实现runnable接口的方法来创建线程,且便于保持程序风格的一致性。
我们知道,一个具有生命的线程,具有...
实现runnable接口。当一个线程已继承了另一个类时,就只能用实现runnable接口的方法来创建线程,且便于保持程序风格的一致性。
我们知道,一个具有生命的线程,具有下面五种状态:
创建状态
使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)
可运行状态
使用start()方法启动一个线程后,系统为该线程分配了除cpu外的所需资源,使该线程处于可运行状态(runnable)
运行中状态
java运行系统通过调度选中一个runnable的线程,使其占有cpu并转为运行中状态(running)。此时,系统真正执行线程的run()方法。
阻塞状态
一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(blocked)
死亡状态
线程结束后是死亡状态(dead)
废话不多说,下面直接上代码:
java代码:
复制代码 代码如下:
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;
}
}
java代码:
复制代码 代码如下:
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()+"元");
}
}
}
java代码:
复制代码 代码如下:
/**
* 存款线程类;
* @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()+"元");
}
}
}
java代码:
复制代码 代码如下:
/**
* 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元