java 使用線程做的一個(gè)簡(jiǎn)單的ATM存取款實(shí)例代碼
實(shí)現(xiàn)Runnable接口。當(dāng)一個(gè)線程已繼承了另一個(gè)類時(shí),就只能用實(shí)現(xiàn)Runnable接口的方法來(lái)創(chuàng)建線程,且便于保持程序風(fēng)格的一致性。
我們知道,一個(gè)具有生命的線程,具有下面五種狀態(tài):
創(chuàng)建狀態(tài)
使用new運(yùn)算符創(chuàng)建一個(gè)線程后,該線程僅僅是一個(gè)空對(duì)象,系統(tǒng)沒(méi)有分配資源,稱該線程處于創(chuàng)建狀態(tài)(new thread)
可運(yùn)行狀態(tài)
使用start()方法啟動(dòng)一個(gè)線程后,系統(tǒng)為該線程分配了除CPU外的所需資源,使該線程處于可運(yùn)行狀態(tài)(Runnable)
運(yùn)行中狀態(tài)
Java運(yùn)行系統(tǒng)通過(guò)調(diào)度選中一個(gè)Runnable的線程,使其占有CPU并轉(zhuǎn)為運(yùn)行中狀態(tài)(Running)。此時(shí),系統(tǒng)真正執(zhí)行線程的run()方法。
阻塞狀態(tài)
一個(gè)正在運(yùn)行的線程因某種原因不能繼續(xù)運(yùn)行時(shí),進(jìn)入阻塞狀態(tài)(Blocked)
死亡狀態(tài)
線程結(jié)束后是死亡狀態(tài)(Dead)
廢話不多說(shuō),下面直接上代碼:
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; //賬戶余額不夠時(shí),則取出,所有的賬戶余額的金額.
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; //賬戶對(duì)象;
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(); //當(dāng)前余額;
synchronized (account) {
try {
sleep(5); //取款發(fā)費(fèi)的時(shí)間;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//取出余額;
int getMonery = account.getMonery(monery);
System.out.println("尊敬的"+account.getName()+"用戶您好!"+"當(dāng)前的余額為:"+currMonery +"元."+"取出余額為:"+getMonery+"元."+"賬戶余額為:"+account.search()+"元");
}
}
}
java代碼:
/**
* 存款線程類;
* @author Administrator
*
*/
public class SaveMoney extends Thread implements Serializable{
private static final long serialVersionUID = 3095120546560212724L;
private Account account; //賬戶對(duì)象;
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(); //查詢賬戶余額;
//同步對(duì)象,只允許單線程操作;
synchronized (account) {
try {
sleep(5); //查詢的時(shí)候,發(fā)費(fèi)得時(shí)間;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
account.putMonery(this.money); //插入金額;
//輸出存款信息;
System.out.println("尊敬的"+account.getName()+"用戶您好!"+"當(dāng)前的余額為:"+currMonery +"元."+"存入余額為:"+this.money+"元."+"賬戶余額為:"+account.search()+"元");
}
}
}
java代碼:
/**
* ATM測(cè)試類;
* @author Administrator
*
*/
public class ThreadATMDemo {
/**
* 主方法;
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Account account = new Account();
//設(shè)置用戶名;
account.setName("ZhouHaiTao");
//初始化余額;
account.setValue(0);
//存入100;
new SaveMoney(100,account).start();
//存入200;
new SaveMoney(200, account).start();
//取出500;
new FetchMoney(500, account).start();
}
}
程序運(yùn)行結(jié)果如下:
尊敬的ZhouHaiTao用戶您好!當(dāng)前的余額為:0元.存入余額為:100元.賬戶余額為:100元
尊敬的ZhouHaiTao用戶您好!當(dāng)前的余額為:0元.存入余額為:200元.賬戶余額為:300元
尊敬的ZhouHaiTao用戶您好!當(dāng)前的余額為:0元.取出余額為:300元.賬戶余額為:0元
- java編寫簡(jiǎn)單的ATM存取系統(tǒng)
- Java實(shí)現(xiàn)ATM取款機(jī)程序
- Java 8 Stream Api 中的 map和 flatMap 操作方法
- java實(shí)現(xiàn)ATM取款項(xiàng)目
- Java實(shí)現(xiàn)銀行ATM系統(tǒng)
- Java項(xiàng)目實(shí)現(xiàn)模擬ATM機(jī)
- java模擬ATM功能(控制臺(tái)連接Mysql數(shù)據(jù)庫(kù))
- 淺談java8 stream flatMap流的扁平化操作
- Java實(shí)現(xiàn)簡(jiǎn)單銀行ATM功能
- Java基于控制臺(tái)界面實(shí)現(xiàn)ATM系統(tǒng)
相關(guān)文章
java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)
這篇文章主要介紹了java 矩陣乘法的mapreduce程序?qū)崿F(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-06-06
SpringBoot+Mybatis plus+React實(shí)現(xiàn)條件選擇切換搜索實(shí)踐
本文主要介紹了SpringBoot+Mybatis plus+React實(shí)現(xiàn)條件選擇切換搜索實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Java字符串格式化功能?String.format用法詳解
String類的format()方法用于創(chuàng)建格式化的字符串以及連接多個(gè)字符串對(duì)象,熟悉C語(yǔ)言的同學(xué)應(yīng)該記得C語(yǔ)言的sprintf()方法,兩者有類似之處,format()方法有兩種重載形式2024-09-09
Spring Boot配置讀取實(shí)現(xiàn)方法解析
這篇文章主要介紹了Spring Boot配置讀取實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
基于SpringMVC中的路徑參數(shù)和URL參數(shù)實(shí)例
這篇文章主要介紹了基于SpringMVC中的路徑參數(shù)和URL參數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
SpringBoot定時(shí)任務(wù)不執(zhí)行的幾個(gè)可能原因及解決方法
這篇文章主要介紹了SpringBoot定時(shí)任務(wù)不執(zhí)行的幾個(gè)可能原因及解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12
使用Spring Security OAuth2實(shí)現(xiàn)單點(diǎn)登錄
在本教程中,我們將討論如何使用Spring Security OAuth和Spring Boot實(shí)現(xiàn)SSO - 單點(diǎn)登錄。感興趣的朋友跟隨小編一起看看吧2019-06-06
Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)項(xiàng)目之倉(cāng)庫(kù)管理系統(tǒng)的實(shí)現(xiàn)流程
這是一個(gè)使用了java+SSM+Maven+Bootstrap+mysql開發(fā)的倉(cāng)庫(kù)管理系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有一個(gè)倉(cāng)庫(kù)管理系統(tǒng)該有的所有功能,感興趣的朋友快來(lái)看看吧2022-01-01

