欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java多線程實(shí)現(xiàn)取款小程序

 更新時(shí)間:2022年05月19日 16:40:41   作者:徐徐大嫂  
這篇文章主要為大家詳細(xì)介紹了java多線程實(shí)現(xiàn)取款小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近java學(xué)到了多線程編程中的線程同步問(wèn)題,教材中的取款小程序?qū)τ诶斫饩€程和線程同步很有幫助,在此將其補(bǔ)充完善.

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é)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java文件操作類 File實(shí)現(xiàn)代碼

    Java文件操作類 File實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java文件操作類 File實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-08-08
  • ZooKeeper集群操作及集群Master選舉搭建啟動(dòng)

    ZooKeeper集群操作及集群Master選舉搭建啟動(dòng)

    這篇文章主要為大家介紹了ZooKeeper集群操作及集群Master選舉搭的建啟動(dòng)詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 利用Thumbnailator輕松實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印

    利用Thumbnailator輕松實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印

    java開(kāi)發(fā)中經(jīng)常遇到對(duì)圖片的處理,JDK中也提供了對(duì)應(yīng)的工具類,不過(guò)處理起來(lái)很麻煩,Thumbnailator是一個(gè)優(yōu)秀的圖片處理的開(kāi)源Java類庫(kù),處理效果遠(yuǎn)比Java API的好,這篇文章主要介紹了利用Thumbnailator如何輕松的實(shí)現(xiàn)圖片縮放、旋轉(zhuǎn)與加水印,需要的朋友可以參考下
    2017-01-01
  • Java數(shù)組的初始化方法詳解

    Java數(shù)組的初始化方法詳解

    在Java程序開(kāi)發(fā)中,數(shù)組是一個(gè)非常常用的數(shù)據(jù)類型,數(shù)組的初始化是使用數(shù)組來(lái)存儲(chǔ)和處理數(shù)據(jù)的關(guān)鍵步驟之一,但是,關(guān)于Java數(shù)組的初始化,經(jīng)常會(huì)讓人感到迷惑,本文將詳細(xì)介紹Java數(shù)組的初始化方法,幫助讀者從此告別關(guān)于Java數(shù)組初始化的困惑
    2023-11-11
  • Java面試題沖刺第二十九天--JVM3

    Java面試題沖刺第二十九天--JVM3

    這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于JVM的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java基礎(chǔ)之堆內(nèi)存溢出的解決

    Java基礎(chǔ)之堆內(nèi)存溢出的解決

    這篇文章主要介紹了Java基礎(chǔ)之堆內(nèi)存溢出的解決,文中有非常詳細(xì)的圖文示例及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Springboot幾種任務(wù)的整合方法

    Springboot幾種任務(wù)的整合方法

    這篇文章主要介紹了Springboot幾種任務(wù)的整合方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java實(shí)戰(zhàn)房屋租賃網(wǎng)的實(shí)現(xiàn)流程

    Java實(shí)戰(zhàn)房屋租賃網(wǎng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)房屋租賃網(wǎng)站,大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • springmvc處理響應(yīng)數(shù)據(jù)的解析

    springmvc處理響應(yīng)數(shù)據(jù)的解析

    今天小編就為大家分享一篇關(guān)于springmvc處理響應(yīng)數(shù)據(jù)的解析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • SpringBoot中@ComponentScan注解過(guò)濾排除不加載某個(gè)類的3種方法

    SpringBoot中@ComponentScan注解過(guò)濾排除不加載某個(gè)類的3種方法

    這篇文章主要給大家介紹了關(guān)于SpringBoot中@ComponentScan注解過(guò)濾排除不加載某個(gè)類的3種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-07-07

最新評(píng)論