第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java中是否有一個“直到條件變?yōu)檎?rdquo;的功能?

Java中是否有一個“直到條件變?yōu)檎?rdquo;的功能?

慕哥9229398 2019-11-27 14:24:41
我正在為服務(wù)器編寫偵聽器線程,此刻我正在使用:while (true){    try {        if (condition){            //do something            condition=false;        }        sleep(1000);    } catch (InterruptedException ex){        Logger.getLogger(server.class.getName()).log(Level.SEVERE, null, ex);    }}使用上面的代碼,我遇到了運行功能吃掉所有cpu時間循環(huán)的問題。睡眠功能有效,但似乎是臨時解決方案,而不是解決方案。是否有一些函數(shù)會阻塞直到變量“ condition”變?yōu)椤?true”?還是連續(xù)循環(huán)等待變量值改變的標(biāo)準(zhǔn)方法?
查看完整描述

3 回答

?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

這樣的輪詢絕對是最不受歡迎的解決方案。


我假設(shè)您有另一個線程將做一些事情來使條件成立。有幾種同步線程的方法。在您的情況下,最簡單的方法是通過對象發(fā)出通知:


主線程:


synchronized(syncObject) {

    try {

        // Calling wait() will block this thread until another thread

        // calls notify() on the object.

        syncObject.wait();

    } catch (InterruptedException e) {

        // Happens if someone interrupts your thread.

    }

}

其他線程:


// Do something

// If the condition is true, do the following:

synchronized(syncObject) {

    syncObject.notify();

}

syncObject本身可以很簡單Object。


查看完整回答
反對 回復(fù) 2019-11-27
?
料青山看我應(yīng)如是

TA貢獻1772條經(jīng)驗 獲得超8個贊

EboMike的答案和Toby的答案都在正確的軌道上,但是它們都有致命的缺陷。該缺陷稱為丟失通知。


問題是,如果一個線程調(diào)用foo.notify(),它將根本不做任何事情,除非某個其他線程已經(jīng)在foo.wait()調(diào)用中處于休眠狀態(tài)。對象,foo不記得它已收到通知。


有一個原因?qū)е虏辉试S您調(diào)用,foo.wait()或者foo.notify()除非線程在foo上同步。這是因為避免丟失通知的唯一方法是使用互斥量保護條件。完成后,它看起來像這樣:


使用者線程:


try {

    synchronized(foo) {

        while(! conditionIsTrue()) {

            foo.wait();

        }

        doSomethingThatRequiresConditionToBeTrue();

    }

} catch (InterruptedException e) {

    handleInterruption();

}

生產(chǎn)者線程:


synchronized(foo) {

    doSomethingThatMakesConditionTrue();

    foo.notify();

}

更改條件的代碼和檢查條件的代碼都在同一對象上同步,并且使用者線程在等待之前顯式測試條件。wait()當(dāng)條件為真時,用戶無法錯過通知并永遠陷入通話中。


另請注意,這wait()是一個循環(huán)。這是因為,在一般情況下,當(dāng)使用者重新獲取foo鎖并喚醒時,其他一些線程可能再次使條件變?yōu)榧佟<词鼓某绦驘o法做到這一點,在某些操作系統(tǒng)中,foo.wait()即使foo.notify()沒有被調(diào)用,也可能返回。這被稱為“ 偽喚醒”,它被允許發(fā)生,因為它使等待/通知在某些操作系統(tǒng)上更容易實現(xiàn)。


查看完整回答
反對 回復(fù) 2019-11-27
  • 3 回答
  • 0 關(guān)注
  • 549 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號