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

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

(0)

相关推荐

  • java实现ATM取款项目

    项目要求: 1.用户需要从控制台输入账号密码,账号或者密码不正确报异常 2.每日取款的金额有限制(100,30000),否则报异常 3.每次取款都要有记录,并在下一次取款时显示出来 思路: 1.先在"银行类"里生成一些用户(跳过了注册环节) 2.可使用List集合存储取款日志 3.可使用Map集合将"用户名"和对应的用户信息建立"键值关系" 4.使用while循环控制流程 项目实现代码: 管理类(含main方法): import java.uti

  • java编写简单的ATM存取系统

    新手练手必备~ 密码账户为: 先创建账户类: 复制代码 代码如下: package cn.Atm; /** * @author 偶my耶 */ import java.io.*; import com.project.project; public class Account {   private String number=null;   private String name=null;   private String password=null;   private double mo

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

    实现Runnable接口.当一个线程已继承了另一个类时,就只能用实现Runnable接口的方法来创建线程,且便于保持程序风格的一致性. 我们知道,一个具有生命的线程,具有下面五种状态: 创建状态 使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread) 可运行状态 使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable) 运行中状态 Java运行系统通过调度选中一个Run

  • Java使用异或运算实现简单的加密解密算法实例代码

    Java简单的加密解密算法,使用异或运算 实例1: package cn.std.util; import java.nio.charset.Charset; public class DeEnCode { private static final String key0 = "FECOI()*&<MNCXZPKL"; private static final Charset charset = Charset.forName("UTF-8"); pr

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

    把省份与城市以树的形式输出 复制代码 代码如下: 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使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = None def _do_func(self): if self._fn: self._fn() self._do_start() def _do_start(self): self.

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

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

  • jquery实现一个简单的表单验证实例

    表单验证在网站开发过程中经常遇到,我们可以使用服务器端语言验证,也可以使用客户端语言来验证.本文章向大家介绍jquery客户端验证表单的一个简单实例.实例仅作参考. <body> <form method="post" action=""> <div class="int"> <label for="username">用户名:</label> <!-- 为每个

  • 使用JSP技术实现一个简单的在线测试系统的实例详解

    1.登陆界面 实现: 本界面由三部分构成,Footer.jsp,Index.jsp,Header.jsp Header.jsp <center> <h2>在线测试系统</h2> <p> <a href="Index.jsp" rel="external nofollow" >登录</a> | <a href="test.jsp" rel="external n

  • python实现一个简单的贪吃蛇游戏附代码

    前言: 不知道有多少同学跟我一样,最初接触编程的动机就是为了自己做个游戏玩? 今天要给大家分享的是一个 pygame 写的“贪吃蛇”小游戏: “贪吃蛇”这个小游戏在编程学习中的常客,因为: 简单,最基本的游戏元素只需要蛇和食物两个就可以进行了.(打飞机还需要三个元素呢,想想分别是什么?)方向的话只要上下左右4个固定方向就可以了.有基本的数据结构和面向对象的思想在其中.游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了.另外比较有趣的一点是,Py

  • 基于React Context实现一个简单的状态管理的示例代码

    目录 前言 封装一个父组件用来包裹其他子组件 子组件如何获取数据呢 class Component 方式 context.Consumer useContext 总结 参考 前言 在大多数情况下,我们开发项目都需要一个状态管理,方便我们在全局共享状态库,在React生态里比较流行的几个库 redux.mobx.recoil 但是对于小项目,我们完全可以自己封装一个状态管理,减少一个包的安装就可以减小打包以后的项目体积. 主要分两步: 封装一个顶层组件提供数据 子组件获取数据和更新数据 封装一个父

  • Handler制作简单相册查看器的实例代码

    Handler类简介 在Android平台中,新启动的线程是无法访问Activity里的Widget的,当然也不能将运行状态外送出来,这就需要有Handler机制进行信息的传递了,Handler类位于android.os包下,主要的功能是完成Activity的Widget与应用程序中线程之间的交互. 开发带有Handler类的程序步骤如下: 1. 在Activity或Activity的Widget中开发Handler类的对象,并重写handlerMessage方法. 2. 在新启动的线程中调用s

随机推荐