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

資訊專欄INFORMATION COLUMN

多線程通信的三大法器,你真的會(huì)用嗎?

liuyix / 2137人閱讀

摘要:是多線程之間通信最重要的個(gè)方法,今天,棧長(zhǎng)給大家普及一下它們的知識(shí)要點(diǎn)及應(yīng)用實(shí)戰(zhàn)。實(shí)戰(zhàn)微信公眾號(hào)技術(shù)棧技術(shù)棧上面的例子結(jié)合來演示了它們的相互作用。更多多線程技術(shù)文章請(qǐng)?jiān)诩夹g(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字多線程。

wait, notify, notifyAll 是多線程之間通信最重要的 3 個(gè)方法,今天,棧長(zhǎng)給大家普及一下它們的知識(shí)要點(diǎn)及應(yīng)用實(shí)戰(zhàn)。

定義

wait:讓持有該對(duì)象鎖的線程等待;

notify: 喚醒任何一個(gè)持有該對(duì)象鎖的線程;

notify: 喚醒所有持有該對(duì)象鎖的線程;

它們 3 個(gè)的關(guān)系是,調(diào)用對(duì)象的 wait 方法使線程暫停運(yùn)行,通過 notify/ notifyAll 方法喚醒調(diào)用 wait 暫時(shí)的線程。

然而,它們并不是 Thread 類中的方法,而是 Object 類中的,為什么呢!? 因?yàn)槊總€(gè)對(duì)象都有監(jiān)視鎖,線程要操作某個(gè)對(duì)象當(dāng)然是要獲取某個(gè)對(duì)象的鎖了,而不是線程的鎖。

如圖所示,wait 帶時(shí)間表示最大超時(shí)時(shí)間,過了時(shí)間還不喚醒就會(huì)自動(dòng)喚醒線程重新競(jìng)爭(zhēng)對(duì)象鎖。

幾個(gè)重要的點(diǎn)

1、調(diào)用對(duì)象的 wait, notify, notifyAll 方法需要擁有對(duì)象的監(jiān)視器鎖,即它們只能在同步方法(塊)中使用;

2、調(diào)用 wait 方法會(huì)使用線程暫停并讓出 CPU 資源,同時(shí)釋放持有的對(duì)象的鎖;

3、多線程使用 notify 容易發(fā)生死鎖,一般使用 notifyAll;

4、關(guān)于 wait 和 sleep 的詳細(xì)區(qū)別請(qǐng)翻閱 《多線程 sleep 和 wait 的 5 個(gè)區(qū)別》這篇文章。

實(shí)戰(zhàn)
/**
 * 微信公眾號(hào):Java技術(shù)棧
 */
public static void main(String[] args) {
    Object lock = new Object();
    Thread t1 = new Thread(() -> {
        synchronized (lock) {
            for (int i = 0; i < 20; i++) {
                System.out.print(i);
                if (i == 10) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    });

    Thread t2 = new Thread(() -> {
        synchronized (lock) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.print("Java技術(shù)棧");
            lock.notifyAll();
        }
    });

    t1.start();
    t2.start();
}

上面的例子結(jié)合 wait/ notifyAll 來演示了它們的相互作用。

線程 t1 首先輸出 012345678910,5秒后繼續(xù)輸出 Java技術(shù)棧111213141516171819。

更多 Java 多線程技術(shù)文章請(qǐng)?jiān)贘ava技術(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字:多線程。

本文原創(chuàng)首發(fā)于微信公眾號(hào):Java技術(shù)棧(id:javastack),關(guān)注公眾號(hào)在后臺(tái)回復(fù) "多線程" 可獲取更多,轉(zhuǎn)載請(qǐng)?jiān)瓨颖A舯拘畔ⅰ?/pre>

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

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

相關(guān)文章

  • 關(guān)于c++namespace,了解嗎?真會(huì)用嗎?

    摘要:據(jù)我了解,很多學(xué)校在學(xué)習(xí)的時(shí)候,老師會(huì)讓學(xué)生死記一條語句,那就是那么你真的了解它嗎命名空間是一個(gè)命名空間。如果我們真的想使用的話,的命名空間遍給了我們解決方法使用命名空間。 據(jù)我了解,很多學(xué)校在學(xué)習(xí)c++的時(shí)候,老師會(huì)讓學(xué)生死記一條語句,那就是 using?namespace?std; 那么...

    Lionad-Morotar 評(píng)論0 收藏0
  • Java學(xué)習(xí)路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強(qiáng))

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評(píng)論0 收藏0
  • 萬萬沒想到,JVM內(nèi)存結(jié)構(gòu)面試題可以問這么難?

    摘要:方法區(qū)在實(shí)際內(nèi)存空間站可以是不連續(xù)的。這一規(guī)定,可以說是給了虛擬機(jī)廠商很大的自由。但是值得注意的是,堆其實(shí)還未每一個(gè)線程單獨(dú)分配了一塊空間,這部分空間在分配時(shí)是線程獨(dú)享的,在使用時(shí)是線程共享的。 在我的博客中,之前有很多文章介紹過JVM內(nèi)存結(jié)構(gòu),相信很多看多我文章的朋友對(duì)這部分知識(shí)都有一定的了解了。 那么,請(qǐng)大家嘗試著回答一下以下問題: 1、JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的? 2、不同的...

    CloudwiseAPM 評(píng)論0 收藏0
  • 大話-node真是單線程嗎?

    摘要:當(dāng)你使用的活動(dòng)監(jiān)視器你會(huì)發(fā)現(xiàn),實(shí)際的進(jìn)程數(shù)為菜鳥是因?yàn)榫€程池的原因嗎老鳥不錯(cuò)嘛,還知道線程池呢但非也非也。菜鳥竟然不是線程池老鳥你忽視了集成了引擎。啟動(dòng)后會(huì)創(chuàng)建實(shí)例,而實(shí)例是多線程的。 老鳥:伸著懶腰,看著窗外明媚的陽光,喝一口清茶,心情大美。一天的好心情莫過于此。老鳥:菜鳥,你這消失了大半個(gè)月,忙什么呢?菜鳥:聽說node最近很火,這不趁著年輕,多儲(chǔ)存點(diǎn)知識(shí)儲(chǔ)備呢!老鳥:那你說說你對(duì)...

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

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

0條評(píng)論

liuyix

|高級(jí)講師

TA的文章

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