您好,登錄后才能下訂單哦!
今天小編給大家分享一下java多線程怎么實現取款小程序的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
1、建立java類
這里建立了三個java類,第一個Account類,用于封裝賬戶中的各種信息;第三個DrawThread類用于實現線程體;第二個類主要封裝了主函數
2、Account類
public class Account { //封裝賬戶編號,賬戶余額和兩個成員變量 private String accountNo; private double balance; public Account(){}; public Account(String accountNo,double balance){ this.accountNo=accountNo; this.balance=balance; } public void setAccountNo(String accountNo) { this.accountNo=accountNo; } public void setBalance(double balance){ this.balance=balance; } public String getAccountNo(){ return accountNo; } public double getBalance(){ return balance; } public int hashCode(){ return accountNo.hashCode(); } public boolean equals(Object obj){ if(this==obj){ return true; } if (obj!=null&&obj.getClass()==Account.class){ Account target=(Account)obj; return target.getAccountNo().equals(accountNo); } return false; } }
3、DrawThread類
public class DrawThread extends Thread { //模擬用戶賬戶 private Account account; //當前取錢線程所希望的取錢數 private double drawAmount; public DrawThread(String name, Account account, double drawAmount) { super(name); this.account = account; this.drawAmount = drawAmount; } //當多個線程修改同一個共享數據時,將涉及數據安全問題 public void run() { //使用account作為同步監視器,任何線程進入下面同步代碼塊之前 //必須先獲得對account賬戶的鎖定——其他線程無法獲得鎖,也就無法修改它 synchronized (account) { if (account.getBalance() >= drawAmount) { //吐出鈔票 System.out.println(getName() + "取錢成功!吐出鈔票:" + drawAmount); /* try { Thread.sleep(1); }catch (InterruptedException ex) { ex.printStackTrace(); } */ //修改余額 account.setBalance(account.getBalance() - drawAmount); System.out.println("\t余額為:" + account.getBalance()); } else { System.out.println(getName() + "取錢失敗!余額不足!"); } } } }
4、DrawTest類
public class DrawTest { public static void main(String[] args){ //創建一個賬戶 Account acct=new Account("1234567",1000); //模擬兩個線程對同一個賬戶取錢 new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start(); } }
運行結果:
以上程序有一點需要注意,就是用到了同步代碼塊。它可以解決run()方法不具備同步安全性(即當兩個線程同時發送請求時即會造成異常)
同步代碼塊:
synchronized (obj){ //需要執行的代碼 }
如果我們去掉run()方法中的同步代碼塊,繼續運行
Account acct=new Account("1234567",1000); new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start();
(銀行賬戶一共1000元,Jack和rose分別對同一賬戶取錢)
運行結果:
以上就是“java多線程怎么實現取款小程序”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。