JAVA取钱多线程实验_JAVA多线程----用--取钱问题2
在該示例代碼中,TestAccount類是測試類,主要實(shí)現(xiàn)創(chuàng)建帳戶Account類的對象,以及啟動(dòng)學(xué)生線程StudentThread和啟動(dòng)家長線程GenearchThread。在StudentThread線程中,執(zhí)行的功能是每隔2秒中取一次錢,每次取50元。在GenearchThread線程中,執(zhí)行的功能是每隔12秒存一次錢,每次存200。這樣存款和取款之間不僅時(shí)間間隔存在差異,而且數(shù)量上也會(huì)出現(xiàn)交叉。而該示例中,最核心的代碼是Account類的實(shí)現(xiàn)。
在Account類中,實(shí)現(xiàn)了同步控制功能,在該類中包含一個(gè)關(guān)鍵的屬性money,該屬性的作用是存儲(chǔ)帳戶金額。在介紹該類的實(shí)現(xiàn)前,首先介紹一下兩個(gè)同步方法——wait和notify方法的使用,這兩個(gè)方法都是Object類中的方法,也就是說每個(gè)類都包含這兩個(gè)方法,換句話說,就是Java天生就支持同步處理。這兩個(gè)方法都只能在synchronized修飾的方法或語句塊內(nèi)部采用被調(diào)用。其中wait方法的作用是使調(diào)用該方法的線程休眠,也就是使該線程退出CPU的等待隊(duì)列,處于冬眠狀態(tài),不執(zhí)行動(dòng)作,也不占用CPU排隊(duì)的時(shí)間,notify方法的作用是喚醒一個(gè)任意該對象的線程,該線程當(dāng)前處于休眠狀態(tài),至于喚醒的具體是那個(gè)則不保證。在Account類中,被StudentThread調(diào)用的getMoney方法的功能是判斷當(dāng)前金額是否是0,如果是則使StudentThread線程處于休眠狀態(tài),如果金額不是0,則取出50元,同時(shí)喚醒使用該帳戶對象的其它一個(gè)線程,而被GenearchThread線程調(diào)用的saveMoney方法的功能是判斷當(dāng)前是否不為0,如果是則使GenearchThread線程處于休眠狀態(tài),如果金額是0,則存入200元,同時(shí)喚醒使用該帳戶對象的其它一個(gè)線程。
如果還是不清楚,那就結(jié)合前面的程序執(zhí)行結(jié)果來解釋一下程序執(zhí)行的過程:在程序開始執(zhí)行時(shí),學(xué)生線程和家長線程都啟動(dòng)起來,所以輸出“準(zhǔn)備取錢”和“準(zhǔn)備存錢”,然后學(xué)生線程按照該線程run方法的邏輯執(zhí)行,先延遲2秒,然后調(diào)用帳戶對象a中的getMoney方法,但是由于初始情況下帳戶對象a中的money數(shù)值為0,所以學(xué)生線程就休眠了。在學(xué)生線程執(zhí)行的同時(shí),家長線程也按照該線程的run方法的邏輯執(zhí)行,先延遲12秒,然后調(diào)用帳戶對象a中的saveMoney方法,由于帳戶a對象中的money為零,條件不成立,所以執(zhí)行存入200元,同時(shí)喚醒線程,由于使用對象a的線程現(xiàn)在只有學(xué)生線程,所以學(xué)生線程被喚醒,開始執(zhí)行邏輯,取出50元,然后喚醒線程,由于當(dāng)前沒有線程處于休眠狀態(tài),所以沒有線程被喚醒。同時(shí)家長線程繼續(xù)執(zhí)行,先延遲12秒,這個(gè)時(shí)候?qū)W生線程執(zhí)行了4次,耗時(shí)4X2秒=8秒,就取光了帳戶中的錢,接著由于帳戶為0則學(xué)生線程又休眠了,一直到家長線程延遲12秒結(jié)束以后,判斷帳戶為0,又存入了200元,程序繼續(xù)執(zhí)行下去。
在解決多線程問題是,互斥和同步都是解決問題的思路,如果需要形象的比較這兩種方式的區(qū)別的話,就看一下下面的示例。一個(gè)比較忙的老總,桌子上有2部電話,在一部處于通話狀態(tài)時(shí),另一部響了,老總拿其這部電話說我在接電話,你等一下,而沒有掛電話,這種處理的方式就是互斥。而如果老總拿其另一部電話說,我在接電話,等會(huì)我打給你,然后掛了電話,這種處理的方式就是同步。兩者相比,互斥明顯占用系統(tǒng)資源(浪費(fèi)電話費(fèi),浪費(fèi)別人的時(shí)間),而同步則是一種更加好的解決問題的思路。
總結(jié)
以上是生活随笔為你收集整理的JAVA取钱多线程实验_JAVA多线程----用--取钱问题2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 数组的get set_java
- 下一篇: java 快速构建ssm项目_SSM快速