成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java并發(fā)編程學(xué)習(xí)之線程的生命周期-wait,notify,notifyall(六)

Terry_Tai / 3034人閱讀

摘要:不釋放持有的鎖,釋放鎖。在調(diào)用方法前,必須持有鎖,調(diào)用喚醒,也要持有鎖。休眠一定時(shí)間后,進(jìn)入就緒狀態(tài)。這兩個(gè)都能被方法中斷當(dāng)前狀態(tài)。用法方獲取鎖判斷條件,不滿足繼續(xù)滿足執(zhí)行其他業(yè)務(wù)方獲取鎖改變條件通知為什么是而不是會(huì)一直循環(huán),直到條件滿足。

sleep和wait

sleep是Thread類的方法,wait是Object的方法。

sleep可以到處使用,wait必須是在同步方法或者代碼塊里使用,不然會(huì)有java.lang.IllegalMonitorStateException異常。

sleep不釋放持有的鎖,wait釋放鎖。wait在調(diào)用方法前,必須持有鎖,調(diào)用notify,notifyall喚醒,也要持有鎖。

sleep休眠一定時(shí)間后,進(jìn)入就緒狀態(tài)。wait由notify和notifyall喚醒。這兩個(gè)都能被interrupt方法中斷當(dāng)前狀態(tài)。

join和yield

這兩個(gè)和sleep一樣,不釋放持有的鎖。

示例
public class WaitDemo {
    private String tv = "廣告";

    static class Tv extends Thread {
        WaitDemo waitDemo;

        public Tv(WaitDemo waitDemo) {
            this.waitDemo = waitDemo;
        }

        @Override
        public void run() {
            waitDemo.waitTv();
        }
    }

    public synchronized void waitTv() {
        while (tv.equals("廣告")) {
            try {
                wait();
                if (tv.equals("廣告")) {
                    System.out.println(Thread.currentThread().getName() + "-" + "騙人,還是廣告");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + "-" +"愉快的追劇");
    }

    public synchronized void sendTrueMsg() {
        tv = "正劇";
        notifyAll();
    }

    public synchronized void sendFalseMsg() {
        notifyAll();
    }

    public static void main(String[] args) throws InterruptedException {
        WaitDemo waitDemo = new WaitDemo();
        Tv tv1 = new Tv(waitDemo);
        Tv tv2 = new Tv(waitDemo);
        tv1.start();
        tv2.start();
        Thread.sleep(100);
        waitDemo.sendFalseMsg();
        Thread.sleep(100);
        waitDemo.sendTrueMsg();
    }
}

運(yùn)行的結(jié)果如下:

例子:大部分人喜歡看連續(xù)劇,但是不看廣告(沒錢買VIP),于是就讓別人提醒她廣告結(jié)束了沒有,如果結(jié)束了,就提醒她。
用法:

wait方

獲取鎖

while判斷條件,不滿足繼續(xù)wait

滿足執(zhí)行其他業(yè)務(wù)

notify方

獲取鎖

改變條件

通知

為什么是while而不是if

while會(huì)一直循環(huán),直到條件滿足。如果是if,只會(huì)判斷一次,如果不滿足條件,會(huì)一直等待

為什么是notifyAll而不是notify

可以把上面的例子,改成notify,那么進(jìn)程永遠(yuǎn)不會(huì)結(jié)束,因?yàn)樵诙嗑€程情況下,notify只能喚醒隨機(jī)的一個(gè)休眠線程,其他已休眠的線程不能喚醒,造成信號(hào)不能傳達(dá)而丟失,而notifyAll可以喚醒所有的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75252.html

相關(guān)文章

  • 一起學(xué)并發(fā)編程 - 等待與通知

    摘要:如果有其它線程調(diào)用了相同對(duì)象的方法,那么處于該對(duì)象的等待池中的線程就會(huì)全部進(jìn)入該對(duì)象的鎖池中,從新爭(zhēng)奪鎖的擁有權(quán)。 wait,notify 和 notifyAll,這些在多線程中被經(jīng)常用到的保留關(guān)鍵字,在實(shí)際開發(fā)的時(shí)候很多時(shí)候卻并沒有被大家重視,而本文則是對(duì)這些關(guān)鍵字的使用進(jìn)行描述。 存在即合理 在java中,每個(gè)對(duì)象都有兩個(gè)池,鎖池(monitor)和等待池(waitset),每個(gè)...

    Meathill 評(píng)論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之線程生命周期-interrupt(七)

    摘要:和是配套使用的,方法容易導(dǎo)致死鎖。方法不會(huì)保證線程的資源正常釋放方法給線程打個(gè)停止標(biāo)記,將線程的中斷狀態(tài)設(shè)置為,并沒有馬上強(qiáng)制中斷線程,線程是否中斷由線程自己決定。終結(jié)狀態(tài),還是返回。方法判斷當(dāng)前線程是否中斷,清除中斷標(biāo)志。 resume、suspend、stop resume和suspend是配套使用的,suspend方法容易導(dǎo)致死鎖。 stop方法不會(huì)保證線程的資源正常釋放 i...

    maxmin 評(píng)論0 收藏0
  • Java并發(fā)總結(jié)

    摘要:限期阻塞調(diào)用方法等待時(shí)間結(jié)束或線程執(zhí)行完畢。終止?fàn)顟B(tài)線程執(zhí)行完畢或出現(xiàn)異常退了。和都會(huì)檢查線程何時(shí)中斷,并且在發(fā)現(xiàn)中斷時(shí)提前放回。工廠方法將線程池的最大大小設(shè)置為,而將基本大小設(shè)置為,并將超時(shí)大小設(shè)置為分鐘。 wait()、notify()、notifyAll() Object是所有類的基類,它有5個(gè)方法組成了等待、通知機(jī)制的核心:notify()、notifyAll()、wait()...

    szysky 評(píng)論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之線程生命周期(一)

    摘要:就緒狀態(tài)調(diào)用或者由阻塞狀態(tài)被解除時(shí),進(jìn)入就緒狀態(tài),此時(shí),只能表示線程可以運(yùn)行了,但不代表已經(jīng)運(yùn)行了,需要等待的調(diào)度。死亡狀態(tài)當(dāng)線程執(zhí)行結(jié)束或者異常等,線程就會(huì)結(jié)束,進(jìn)入死亡狀態(tài)。 流程圖 showImg(https://segmentfault.com/img/bVbuJ6f); 新建狀態(tài) 當(dāng)用new創(chuàng)建一個(gè)線程后,線程就處于新建狀態(tài),此時(shí)和其他普通java對(duì)象一樣,由JVM創(chuàng)建內(nèi)存空...

    AndroidTraveler 評(píng)論0 收藏0
  • Java線程學(xué)習(xí)(四)等待/通知(wait/notify)機(jī)制

    摘要:運(yùn)行可運(yùn)行狀態(tài)的線程獲得了時(shí)間片,執(zhí)行程序代碼。阻塞的情況分三種一等待阻塞運(yùn)行的線程執(zhí)行方法,會(huì)把該線程放入等待隊(duì)列中。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)synchronized關(guān)鍵...

    PiscesYE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<