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

线程 Thread 类,和 Runable 接口 比较两者的特点和应用领域.

可以,直接继承线程Thread类。该方法编写简单,可以直接操作线程,适用于单重继承情况,因而不能在继承其他类

实现Runnable接口。当一个线程已继承了另一个类时,就只能用实现Runnable接口的方法来创建线程,且便于保持程序风格的一致性。

我们知道,一个具有生命的线程,具有下面五种状态:

创建状态

使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)

可运行状态

使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)

运行中状态

Java运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状态(Running)。此时,系统真正执行线程的run()方法。

阻塞状态

一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Blocked)

死亡状态

线程结束后是死亡状态(Dead)

废话不多说,下面直接上代码:

Java代码:

 1     package pack.java.thread.atm;  
 2     /** 
 3      * 账户类; 
 4      * @author Administrator 
 5      * 
 6      */  
 7     public class Account {  
 8           
 9         private String name;  //用户名;  
10         private int value;    //账户余额;  
11           
12         /** 
13          * 存入金额; 
14          * @param monery 
15          */  
16         public void putMonery(int monery){  
17             this.value = this.value + monery;   
18         }  
19           
20         /** 
21          * 取出金额; 
22          * @param monery 
23          * @return 金额; 
24          */  
25         public int getMonery(int monery){  
26               
27             //判断是否账户余额是否大于 要取出的钱;  
28             if(this.value > monery ){  
29                 this.value = this.value - monery;     
30             }else{  
31                 monery = this.value;  //账户余额不够时,则取出,所有的账户余额的金额.   
32                 this.value = 0;  
33             }  
34             //返回取出的钱;  
35             return monery;  
36         }  
37           
38         /** 
39          * 查询余额; 
40          * @return 返回账户余额; 
41          */  
42         public int search(){  
43             return this.value;  
44         }  
45           
46         public String getName() {  
47             return name;  
48         }  
49         public void setName(String name) {  
50             this.name = name;  
51         }  
52         public int getValue() {  
53             return value;  
54         }  
55         public void setValue(int value) {  
56             this.value = value;  
57         }  
58     }  

java代码:

 1 import java.io.Serializable;  
 2 /** 
 3  * 取款线程类; 
 4  * @author Administrator 
 5  * 
 6  */  
 7 public class FetchMoney extends Thread implements Serializable{  
 8       
 9     private static final long serialVersionUID = -5059599151558445815L;  
10   
11     private Account account;  //账户对象;  
12     private int monery;       //余额;  
13       
14     public FetchMoney(){  
15         super();  
16     }  
17       
18     public FetchMoney(int monery,Account account){  
19         this.account = account;  
20         this.monery = monery;  
21     }  
22       
23     @Override  
24     public void run() {  
25         // TODO Auto-generated method stub  
26         int currMonery  = account.search();  //当前余额;  
27         synchronized (account) {  
28             try {  
29                 sleep(5);   //取款发费的时间;  
30             } catch (InterruptedException e) {  
31                 // TODO Auto-generated catch block  
32                 e.printStackTrace();  
33             }  
34             //取出余额;  
35             int getMonery = account.getMonery(monery);  
36             System.out.println("尊敬的"+account.getName()+"用户您好!"+"当前的余额为:"+currMonery +"元."+"取出余额为:"+getMonery+"元."+"账户余额为:"+account.search()+"元");  
37         }  
38     }  
39 }  

java代码:

 1 /** 
 2  * 存款线程类; 
 3  * @author Administrator 
 4  * 
 5  */  
 6 public class SaveMoney extends Thread implements Serializable{  
 7   
 8     private static final long serialVersionUID = 3095120546560212724L;  
 9       
10     private Account account;  //账户对象;  
11     private int money;        //金额;  
12       
13     public SaveMoney(){  
14         super();  
15     }  
16       
17     public SaveMoney(int money,Account account){  
18         this.account = account;  
19         this.money = money;  
20     }  
21       
22     @Override  
23     public void run() {  
24         // TODO Auto-generated method stub  
25         int currMonery = account.search(); //查询账户余额;  
26           
27         //同步对象,只允许单线程操作;  
28         synchronized (account) {  
29             try {  
30                 sleep(5);  //查询的时候,发费得时间;  
31             } catch (InterruptedException e) {  
32                 // TODO Auto-generated catch block  
33                 e.printStackTrace();  
34             }  
35             account.putMonery(this.money);   //插入金额;  
36             //输出存款信息;  
37             System.out.println("尊敬的"+account.getName()+"用户您好!"+"当前的余额为:"+currMonery +"元."+"存入余额为:"+this.money+"元."+"账户余额为:"+account.search()+"元");  
38         }  
39     }  
40 }  

java代码:

 1 /** 
 2  * ATM测试类; 
 3  * @author Administrator 
 4  * 
 5  */  
 6 public class ThreadATMDemo {  
 7   
 8     /** 
 9      * 主方法; 
10      * @param args 
11      */  
12     public static void main(String[] args) {  
13         // TODO Auto-generated method stub  
14         Account account = new Account();  
15         //设置用户名;  
16         account.setName("ZhouHaiTao");  
17         //初始化余额;  
18         account.setValue(0);  
19           
20         //存入100;  
21         new SaveMoney(100,account).start();  
22           
23         //存入200;  
24         new SaveMoney(200, account).start();  
25           
26         //取出500;  
27         new FetchMoney(500, account).start();  
28     }  
29 }  

程序运行结果如下:

尊敬的ZhouHaiTao用户您好!当前的余额为:0元.存入余额为:100元.账户余额为:100元
尊敬的ZhouHaiTao用户您好!当前的余额为:0元.存入余额为:200元.账户余额为:300元
尊敬的ZhouHaiTao用户您好!当前的余额为:0元.取出余额为:300元.账户余额为:0元

原文地址:https://www.cnblogs.com/xingmeng/p/3267830.html