熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java2入門經典教程 11.2 管理線程[9]

2013-11-23 19:58:00  來源: Java高級技術 

    調用sleep()和調用wait(}的主要不同之處是wait()釋放當前線程對其加鎖的任何對象但是seep()不行wait()按這種方式作很重要否則另一個線程沒辦法改變以使當前線程要求的條件能被滿足

    因此wait()有代表性的使用是
    sychronized(anibject)
    {
    while(conditionnotmet)
    anobjectwait();
    //condition is met so continnue……
    }

    這裡當wail()方法被調用時這個線程將掛起操作直到針對同一對象的某個其他同步經調用notifyf()(或更有代表性的notifyAll())後者允許while環繼續並再次檢查條件當然這仍可以不被滿足在這種情況下wait()方法將再次被調用因此另一個線程可以對anObject操作從這點上你可以看到wait()不只是為了得到一個對象的訪問直到滿足某些條件時才允許其他線程訪問你甚至可以安排一個線程不能繼續工作直到給定數量的其他線程對這個對象調用了notify()來確保實現最小數量的操作

    當你有多於兩個的線程對一個對象同步時最好用nntifyAll()而不用notify()當兩個或多個線程通過調用wait()掛起時如果你調用notify()只有其中一個線程被啟動但不能直接控制它這可能造成被啟動的線程再次調用wait()因為它要求的條件沒被滿足這些將讓所有的線程互相等待不可能繼續執行

    雖然這些方法每個功能都非常簡單但應用它們會變得非常復雜通過使用synchronized方法和代碼塊的對象很有可能多個線程相互影響我們通過看看如何使用wait()和notifyAll()去掉最後一個例子中的兒個while循環探討一些基本內容

    在銀行程序中使用Wait()和notifyAll()

    在生成交易並將它們傳遞給Clerk對象的main()方法的for循環中我們有兩個對Clerk對象調用isBusy()方法的while循環當職員仍然忙時我們不能向職員傳遞交易通過改變Clerk類為了使Clerk類可以使用wait()和notifyAll()我們去掉這個需求

Java入門經典在線教程完整版 

[]  []  []  []  []  []  []  []  []  


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27744.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.