您好,登錄后才能下訂單哦!
今天小編給大家分享一下java多線程怎么實(shí)現(xiàn)取款小程序的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
1、建立java類
這里建立了三個(gè)java類,第一個(gè)Account類,用于封裝賬戶中的各種信息;第三個(gè)DrawThread類用于實(shí)現(xiàn)線程體;第二個(gè)類主要封裝了主函數(shù)
2、Account類
public class Account { //封裝賬戶編號(hào),賬戶余額和兩個(gè)成員變量 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; //當(dāng)前取錢線程所希望的取錢數(shù) private double drawAmount; public DrawThread(String name, Account account, double drawAmount) { super(name); this.account = account; this.drawAmount = drawAmount; } //當(dāng)多個(gè)線程修改同一個(gè)共享數(shù)據(jù)時(shí),將涉及數(shù)據(jù)安全問(wèn)題 public void run() { //使用account作為同步監(jiān)視器,任何線程進(jìn)入下面同步代碼塊之前 //必須先獲得對(duì)account賬戶的鎖定——其他線程無(wú)法獲得鎖,也就無(wú)法修改它 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){ //創(chuàng)建一個(gè)賬戶 Account acct=new Account("1234567",1000); //模擬兩個(gè)線程對(duì)同一個(gè)賬戶取錢 new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start(); } }
運(yùn)行結(jié)果:
以上程序有一點(diǎn)需要注意,就是用到了同步代碼塊。它可以解決run()方法不具備同步安全性(即當(dāng)兩個(gè)線程同時(shí)發(fā)送請(qǐng)求時(shí)即會(huì)造成異常)
同步代碼塊:
synchronized (obj){ //需要執(zhí)行的代碼 }
如果我們?nèi)サ魊un()方法中的同步代碼塊,繼續(xù)運(yùn)行
Account acct=new Account("1234567",1000); new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start();
(銀行賬戶一共1000元,Jack和rose分別對(duì)同一賬戶取錢)
運(yùn)行結(jié)果:
以上就是“java多線程怎么實(shí)現(xiàn)取款小程序”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。