最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

最近java學(xué)到了多線程編程中的線程同步問題,教材中的取款小程序?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ù)安全問題
? ? public void run() {
? ? ? ? //使用account作為同步監(jiān)視器,任何線程進(jìn)入下面同步代碼塊之前
? ? ? ? //必須先獲得對(duì)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){
? ? ? ? //創(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)文章

  • 詳解SpringMVC如何進(jìn)行數(shù)據(jù)回顯

    詳解SpringMVC如何進(jìn)行數(shù)據(jù)回顯

    這篇文章主要介紹了詳解SpringMVC如何進(jìn)行數(shù)據(jù)回顯,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • java追加寫入txt文件的方法總結(jié)

    java追加寫入txt文件的方法總結(jié)

    在本篇文章里我們給大家整理了關(guān)于java如何追加寫入txt文件的方法和代碼,需要的朋友們可以參考下。
    2020-02-02
  • 基于SpringBoot實(shí)現(xiàn)防盜鏈功能

    基于SpringBoot實(shí)現(xiàn)防盜鏈功能

    防盜鏈?zhǔn)潜Wo(hù)資源服務(wù)器的常用方法,旨在防止未經(jīng)授權(quán)的外部鏈接直接訪問服務(wù)器上的資源,如圖片、音頻和視頻文件,在本文中,我們將探討防盜鏈的概念和原理,并結(jié)合 Spring Boot 提供一個(gè)完整的可運(yùn)行示例,需要的朋友可以參考下
    2024-12-12
  • SpringCloud Gateway的基本入門和注意點(diǎn)詳解

    SpringCloud Gateway的基本入門和注意點(diǎn)詳解

    這篇文章主要介紹了SpringCloud Gateway的基本入門和注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • javaWeb傳收參數(shù)方式總結(jié)示例分析

    javaWeb傳收參數(shù)方式總結(jié)示例分析

    這篇文章主要為大家介紹了javaWeb傳收參數(shù)方式總結(jié)示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • SpringBoot整合XxlJob分布式任務(wù)調(diào)度平臺(tái)

    SpringBoot整合XxlJob分布式任務(wù)調(diào)度平臺(tái)

    xxl-job是一個(gè)開源的分布式定時(shí)任務(wù)框架,它可以與其他微服務(wù)組件一起構(gòu)成微服務(wù)集群。它的調(diào)度中心(xxl-job)和執(zhí)行器(自己的springboot項(xiàng)目中有@XxlJob("定時(shí)任務(wù)名稱")的方法)是相互分離,分開部署的,兩者通過HTTP協(xié)議進(jìn)行通信
    2023-02-02
  • IDEA?mybatis?Mapper.xml報(bào)紅的最新解決辦法

    IDEA?mybatis?Mapper.xml報(bào)紅的最新解決辦法

    這篇文章主要介紹了IDEA?mybatis?Mapper.xml報(bào)紅的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • java 中死鎖問題的實(shí)例詳解

    java 中死鎖問題的實(shí)例詳解

    這篇文章主要介紹了java 中死鎖問題的實(shí)例詳解的相關(guān)資料,希望通過本文大家能夠理解掌握死鎖的問題,需要的朋友可以參考下
    2017-09-09
  • springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過程

    springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過程

    這篇文章主要給大家介紹了關(guān)于springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過程,Spring Boot應(yīng)用中可以配置多個(gè)數(shù)據(jù)源,并根據(jù)注解靈活指定當(dāng)前使用的數(shù)據(jù)源,需要的朋友可以參考下
    2023-08-08
  • Spring?Cloud?Ribbon的使用原理解析

    Spring?Cloud?Ribbon的使用原理解析

    現(xiàn)在Java非常流行微服務(wù),也就是所謂的面向服務(wù)開發(fā),將一個(gè)項(xiàng)目拆分成了多個(gè)項(xiàng)目,其優(yōu)點(diǎn)有很多,其中一個(gè)優(yōu)點(diǎn)就是:將服務(wù)拆分成一個(gè)一個(gè)微服務(wù)后,我們很容易的來針對(duì)性的進(jìn)行集群部署,這篇文章主要介紹了Spring?Cloud?Ribbon的使用詳解,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

靖州| 射阳县| 赤城县| 霍州市| 铜陵市| 威远县| 潍坊市| 彩票| 含山县| 长海县| 龙江县| 隆尧县| 台北市| 景洪市| 浏阳市| 霍邱县| 汝阳县| 芮城县| 镇安县| 临沂市| 民和| 喜德县| 高唐县| 泾源县| 开阳县| 富锦市| 宕昌县| 浦东新区| 元朗区| 永定县| 白朗县| 盱眙县| 增城市| 邯郸县| 三亚市| 大兴区| 德州市| 扬中市| 姜堰市| 襄汾县| 罗城|