1. 程式人生 > >java多執行緒入門案例(1)之簡單銀行取款問題及其優化

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:此案例來源於外聘老師的課堂案例講解。

新手第一次寫部落格,有許多不足之處,請各位大佬指出,多多指教。