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

实现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元

时间: 2024-10-24 15:02:38

java 使用线程做的一个简单的ATM存取款实例代码_java的相关文章

Java实现FTP文件的上传和下载功能的实例代码_java

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件.在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)."下载"文件就是从远程主机拷贝文件至自己

java 利用Map做缓存一个简单实例

有时候需要将一批数据缓存,并且按照最近最少使用的规则淘汰.这时候就应该想到LRUMap. LRUMap是一种尺寸固定的Map,当它的容量达到最大时采用最近最少使用的规则淘汰相应的元素.  代码如下 复制代码 LRUMap cache = newLRUMap(5);   cache.put("01", "news 1"); cache.put("02", "news 2"); cache.put("03",

一个简单的Ext.XTemplate的实例代码_extjs

把省份与城市以树的形式输出 复制代码 代码如下: Ext.lib.Ajax.request( 'POST', '/Index/mainIndex', { success: function (data) { data.responseText = "{pros:" + data.responseText + "}"; //获取后台回调的省份城市JSON格式数据 var response = Ext.util.JSON.decode(data.responseText

python使用线程封装的一个简单定时器类实例

  本文实例讲述了python使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = N

jquery做的一个简单的屏幕锁定提示框

 这篇文章主要介绍了使用jquery做的一个简单的屏幕锁定提示框,需要的朋友可以参考下 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml"&

JQuery做的一个简单的点灯游戏分享_jquery

最近屌丝被迫学习TypeScript(不学就会被开除,5555),所以得先学JavaScript,这下可好,所有网页相关的东西都得要有所了解,否则没法忽悠BOSS. 今天学了一小会JavaScript,这里先做了一个简单的点灯游戏,算是练手吧.其中用到了JQuery,否则事件绑定就会蛋疼了. 做为JavaScript的Hello World,这个玩意就是下面这个东东.这里简单说一下实现方法. 效果图: 首先定义一个样式表,别忘了自定义的元素前都要加圆点,否则无效(菜鸟被这个玩意害了好多次啊):a

java-关于Java变量的值以及一个简单的for循环语句

问题描述 关于Java变量的值以及一个简单的for循环语句 for(int i=2,j=1; j<10; i=(i==9)?(((++j)/j)+1):(i+1)){ System.out.printf("%d*%d=%2d%c",i,j,i*j, ((i==9)?'n':' ')); } 打印九九乘法表. (++j)/j+1中j和++j的值是怎么变化的?每一次循环j的值不是都应该加1吗? 谢谢各位 解决方案 自己动手编译调试一边,写程序重在实践 解决方案二: Java 运算符

android开发-一个简单的单击事件监听代码哪里错了?

问题描述 一个简单的单击事件监听代码哪里错了? MainActivity.java package com.example.a007;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClic

密码学-求一个简单ElGamal数字签名,控制台程序代码就行

问题描述 求一个简单ElGamal数字签名,控制台程序代码就行 求一个简单ElGamal数字签名,C或C++控制台程序代码就行, rsa数字签名也有的更好,谢谢大神,让我应付下密码学的算法设计. 解决方案 http://www.pudn.com/downloads113/sourcecode/crypt/detail472998.htmlhttp://www.codesoso.net/Record/122168_115197_1.htmlhttp://download.csdn.net/down