溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2022-05-20 09:12:55 來(lái)源:億速云 閱讀:109 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下java多線程怎么實(shí)現(xiàn)取款小程序的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

1、建立java類

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

這里建立了三個(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é)果:

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

以上程序有一點(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)取款小程序

以上就是“java多線程怎么實(shí)現(xiàn)取款小程序”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI