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(); } } } }
執行效果:
ps:此案例來源於外聘老師的課堂案例講解。
新手第一次寫部落格,有許多不足之處,請各位大佬指出,多多指教。