java多執行緒入門案例(1)之簡單銀行取款問題及其優化
之前學java的時候,學校老師由於課時問題,沒有教我們多執行緒,最近學校外聘的企業教師給我們做實訓要用到多執行緒,因此才初步瞭解多執行緒,以下這個案例只是介紹java程式碼優化,程式碼中有涉及多執行緒,但今天不對其講解,只簡單講解程式碼優化的問題,希望對初學者有幫助。
大概案例:有PeasonA跟PeasonB在銀行(bank)以同一個賬號取錢,取錢方式可以為櫃檯取款和ATM機取款。銀行賬號總共有1000元,PeasonA每隔1秒取款100元,PeasonB每隔2秒取款150元,兩人同時取款。當銀行賬戶不足100或者150元時,取款結束。
1.優化前:
注意:在進行任何專案程式編碼時,先把基本框架寫出來。
(1)程式入口類:Main.java
//程式入口類
public class Main {
//程式入口函式
public static void main(String[] args){
Bank bank=new Bank();
PersonA a=new PersonA(bank);
a.start();
PersonB b=new PersonB(bank);
b.start();
}
}
(2)銀行類:Bank.java
//銀行類
public class Bank {
public int money=10000;//錢
//櫃檯取錢函式
public void Counter(int num){
money-=num;
System.out.println("A取了:"+num+" 剩餘錢數:"+money);
}
//ATM取錢函式
public void Atm(int num){
money-=num;
System.out.println("B取了:"+num+" 剩餘錢數:"+money);
}
}
(3)personA類:PersonA.java
//A
public class PersonA extends Thread {
private Bank bank;
//建構函式
public PersonA(Bank bank){
this.bank=bank;
}
@Override
public void run(){
while(bank.money>=100){
bank.Counter(100);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
(4)PersonB類:PersonB.java
public class PersonB extends Thread{
private Bank bank;
//建構函式
public PersonB(Bank bank){
this.bank=bank;
}
@Override
public void run(){
while(bank.money>=150){
bank.Atm(150);
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2.優化後:
(1)程式入口類:
//程式入口類
public class Main {
//程式入口函式
public static void main(String[] args){
Person a=new Person("Tom","A",100,1000);
a.start();
Person b=new Person("Ru","B",150,2000);
b.start();
Person c=new Person("小敏","A",250,2500);
c.start();
}
}
(2)銀行類:Bank.java
//銀行類
public class Bank {
public static int money=10000;//錢
//櫃檯取錢函式
public static void Counter(String name,int num){
money-=num;
System.out.println(name+"取了:"+num+" 剩餘錢數:"+money);
}
//ATM取錢函式
public static void Atm(String name,int num){
money-=num;
System.out.println(name+"取了:"+num+" 剩餘錢數:"+money);
}
}
(3)Person類:person.java
//角色類
public class Person extends Thread {
private String name;
private String type;
private int num;
private int deltime;
public Person(String name,String type,int num,int deltime){
this.name=name;
this.type=type;
this.num=num;
this.deltime=deltime;
}
@Override
public void run(){
while(Bank.money>=num){
if(type=="A"){
Bank.Counter(name,num);
}else{
Bank.Atm(name,num);
}
try {
sleep(deltime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
執行效果:
具體程式碼可以在github上下載:https://github.com/whitedouble/whitedouble.git
ps:此案例來源於外聘老師的課堂案例講解。
新手第一次寫部落格,有許多不足之處,請各位大佬指出,多多指教。