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