1. 程式人生 > >執行緒例項模仿人在銀行取錢

執行緒例項模仿人在銀行取錢

package thread;


public class Bank{
 
private String name;
public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public Bank(String name) {
super();
this.name = name;
}


// 一個賬戶有2000塊錢
   static int money = 2000;
   
   // 櫃檯取錢的方法
   public void Counter(int money) {//每次取走的錢數
       Bank.money -= money;//取錢後總額減少
      
   }
    
   // ATM取錢的方法
   public void ATM(int money) {//每次取走的錢數
       Bank.money -= money;//取錢後總額減少
   }
 
   
   
private static String[] shareObj = {"true"}; // 建立一個靜態鑰匙//可以任意定義
 static class PersonA extends Thread {
    // 建立銀行物件
        Bank bank;
        //通過構造器傳入銀行物件,確保兩個人進入的是一個銀行
        public PersonA(Bank bank, String name) {
    super(name);
    this.bank = bank;
    }
        
        
        //重寫run方法,在裡面實現使用櫃檯取錢
        @Override
            public void run() {
        synchronized (shareObj) {// 這個很重要屬於銀行的取款號碼,一個人完成下一個人才能使用櫃檯取款
                while (Bank.money >= 100) {
                int money = 100;
                    bank.Counter(money);// 每次取100塊
                    System.out.println(this.getName()+"在"+bank.getName()+"取走了" +money + "還剩下" +(Bank.money));
                    try {
                     shareObj.wait();//櫃檯工作人員暫停服務!
} catch (InterruptedException e) {
  e.printStackTrace();
}
                    if(Bank.money==0){
               System.err.println("不好意思銀行暫時沒有現金了!");
               break;
               }
                try {
                    sleep(1000);//取完櫃檯工作人員休息1秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        }



static class PersonB extends Thread{
// 建立銀行物件
   Bank bank;
   // 通過構造器傳入銀行物件,確保兩個人進入的是一個銀行
   public PersonB(Bank bank, String name) {
super(name);
this.bank = bank;
}
   // 重寫run方法,在裡面實現使用櫃檯取錢
   @Override
   public void run() {
   synchronized (shareObj) {
       while (Bank.money >= 200) {
        int money = 200;
           bank.ATM(money);// 每次取200塊
           System.out.println(this.getName()+"在"+bank.getName()+"取走了" + money + "還剩下" +(Bank.money));
           shareObj.notifyAll();
          
           if(Bank.money==0){
            System.err.println(this.getName()+"在"+bank.getName()+"把剩餘的錢取完了!");
            break;
           }
           try {
               sleep(1000);// ATM反應1秒
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   }
   }
}


//三個人在銀行取錢


    public static void main(String[] args) {
    //銀行的櫃檯
        Bank bank1 = new Bank("銀行櫃檯");
        //銀行的取款機
        Bank bank2 = new Bank("銀行ATM機");
        // 例項化三個人,在同一個銀行取錢
        PersonA pA = new PersonA(bank1,"A");
        PersonA PA2  = new PersonA(bank1,"B");
        PersonB pB = new PersonB(bank2,"C");
       
        //pA和PA2在櫃檯排隊取錢:PB在ATM機取錢
        pA.start();
        PA2.start();
        pB.start();
         
    }
}
}