java 使用執行緒做一個簡單的ATM存取款例項.
好久,沒寫程式碼了, 利用多餘的時間,寫一個簡單的多執行緒例子,鞏固一下,以前學習的多執行緒知識..
執行緒 Thread 類,和 Runable 介面 比較兩者的特點和應用領域.
可以,直接繼承執行緒Thread類。該方法編寫簡單,可以直接操作執行緒,適用於單重繼承情況,因而不能在繼承其他類
實現Runnable介面。當一個執行緒已繼承了另一個類時,就只能用實現Runnable介面的方法來建立執行緒,且便於保持程式風格的一致性。
我們知道,一個具有生命的執行緒,具有下面五種狀態:
建立狀態
使用new運算子建立一個執行緒後,該執行緒僅僅是一個空物件,系統沒有分配資源,稱該執行緒處於建立狀態(new thread)
可執行狀態
使用start()方法啟動一個執行緒後,系統為該執行緒分配了除CPU外的所需資源,使該執行緒處於可執行狀態(Runnable)
執行中狀態
Java執行系統通過排程選中一個Runnable的執行緒,使其佔有CPU並轉為執行中狀態(Running)。此時,系統真正執行執行緒的run()方法。
阻塞狀態
一個正在執行的執行緒因某種原因不能繼續執行時,進入阻塞狀態(Blocked)
死亡狀態
執行緒結束後是死亡狀態(Dead)
廢話不多說,下面直接上程式碼:
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;
}
}
package pack.java.thread.atm;
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()+"元");
}
}
}
package pack.java.thread.atm;
import java.io.Serializable;
/**
* 存款執行緒類;
* @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()+"元");
}
}
}
package pack.java.thread.atm;
/**
* 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元
相關文章
- java多執行緒 wait() notify()簡單使用Java執行緒AI
- 多執行緒併發鎖分類以及簡單例項執行緒單例
- 不使用synchronized和lock,如何實現一個執行緒安全的單例?synchronized執行緒單例
- 唯一標識 Java 執行的例項Java
- Java之執行緒同步完成售票例項的6種方式Java執行緒
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- Java 21中使用虛擬執行緒的簡單Http ServerJava執行緒HTTPServer
- 簡單的執行緒池執行緒
- 一個簡單java程式的執行全過程Java
- 關於程式與執行緒的一個簡單解釋執行緒
- Java多執行緒就是這麼簡單Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- Java的Socket通訊簡單例項Java單例
- java多執行緒之執行緒的基本使用Java執行緒
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- 簡單的執行緒池(八)執行緒
- 簡單的執行緒池(二)執行緒
- 簡單的執行緒池(七)執行緒
- 簡單的執行緒池(四)執行緒
- 簡單的執行緒池(六)執行緒
- 簡單的執行緒池(三)執行緒
- 簡單的執行緒池(九)執行緒
- Python程式和執行緒例項詳解Python執行緒
- JAVA執行緒池的使用Java執行緒
- JAVA多執行緒使用場景和注意事項Java執行緒
- 【Java面試】如何中斷一個正在執行的執行緒?Java面試執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- Java 關於執行緒的一些使用Java執行緒
- ObjC 多執行緒簡析(一)-多執行緒簡述和執行緒鎖的基本應用OBJ執行緒
- Java多執行緒程式設計筆記10:單例模式Java執行緒程式設計筆記單例模式
- java使用多執行緒Java執行緒
- 幾種簡潔建立執行緒的方式以及使用注意事項執行緒
- docker 執行elasticsearch單例項(elasticsearch:7.12.0)DockerElasticsearch單例
- 騰訊遊戲學院專家:做一個多執行緒遊戲框架可以多簡單?遊戲執行緒框架
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- 執行緒問題2(注意例項變數)執行緒變數
- Java多執行緒的使用(二)Java執行緒
- 簡單C++執行緒池C++執行緒