銀行取錢肯定不能透支這個是眾所周知的,實現此功能就需要借助多執行緒的知識!
先來看一下採取同步措施前產生的結果:
好的,我們先來定義乙個賬戶類:
/**
* 賬戶類,含卡號,還有餘額 通過同步方法防止出現餘額為負的情況
* * @author mr.gao
*/public class account
public string getaccountno()
public void setaccountno(string accountno)
public double getbalance()
public void setbalance(double balance)
public int hashcode()
public boolean equals(object obj) else if (!accountno.equals(other.accountno))
return false;
if (double.doubletolongbits(balance) != double
.doubletolongbits(other.balance))
return false;
return true;
} public string tostring()
/*** 同步取錢方法,防止餘額為負
* @param accountamount
*/public synchronized void draw(double accountamount) catch (interruptedexception e)
balance -= accountamount;
system.out.println("餘額為\t" + balance);
} else
}}
定義乙個執行緒類,主要演示同步方法,注釋的部分為同步**塊的內容:
/**
* 取錢執行緒採用的是繼承的方式
* 無須自己實現取錢的操作,直接呼叫account的draw()方法實現,符合"加鎖--修改--釋放鎖"的邏輯
* 符合 領域驅動設計(每個類都是完整的領域物件,例如使用者賬戶提供相應的方法去處理賬戶所對應的需求)
* @author mr.gao
* */
public class drawthread extends thread
public void run() catch (interruptedexception e)
// account.setbalance(account.getbalance() - drawamount);
// system.out.println("餘額為\t" + account.getbalance());
//// } else
// }
/** 直接呼叫account物件的draw()方法,同步方法的同步監視器是this,
* this代表呼叫draw()方法的物件,也就是說,再進入draw()方法前先對account物件進行加鎖
*/account.draw(drawamount);
}}
測試**:
/**
* 結果測試
* * @author mr.gao
* */
public class accounttest
}
輸出效果:
Java多執行緒經典案例
1.三個售票視窗同時 20張票 public class demo1 class ticketoffice implements runnable override public void run else catch interruptedexception e 2.建立兩個執行緒,其中乙個輸出1...
QThread多執行緒程式設計經典案例分析
傳統的圖形介面應用程式都只有乙個執行緒執行,並且一次執行乙個操作。如果使用者呼叫乙個比較耗時的操作,就會凍結介面響應。乙個解決方法是按照事件處理的思路 另外乙個解決方法是 採用多執行緒。qt qthread多執行緒程式設計的方法一直有個爭議,就是bradley t.hughes you re doi...
QThread多執行緒程式設計經典案例分析
傳統的圖形介面應用程式都只有乙個執行緒執行,並且一次執行乙個操作。如果使用者呼叫乙個比較耗時的操作,就會凍結介面響應。乙個解決方法是按照事件處理的思路 另外乙個解決方法是 採用多執行緒。qt qthread多執行緒程式設計的方法一直有個爭議,就是bradley t.hughes you re doi...