亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

liuyix / 2213人閱讀

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

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

定義

wait:讓持有該對象鎖的線程等待;

notify: 喚醒任何一個持有該對象鎖的線程;

notify: 喚醒所有持有該對象鎖的線程;

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

然而,它們并不是 Thread 類中的方法,而是 Object 類中的,為什么呢!? 因為每個對象都有監(jiān)視鎖,線程要操作某個對象當然是要獲取某個對象的鎖了,而不是線程的鎖。

如圖所示,wait 帶時間表示最大超時時間,過了時間還不喚醒就會自動喚醒線程重新競爭對象鎖。

幾個重要的點

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

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

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

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

實戰(zhàn)
/**
 * 微信公眾號: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ù)文章請在Java技術(shù)棧微信公眾號后臺回復(fù)關(guān)鍵字:多線程。

本文原創(chuàng)首發(fā)于微信公眾號:Java技術(shù)棧(id:javastack),關(guān)注公眾號在后臺回復(fù) "多線程" 可獲取更多,轉(zhuǎn)載請原樣保留本信息。

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/72436.html

相關(guān)文章

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

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

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

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

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

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

    CloudwiseAPM 評論0 收藏0
  • 大話-node真是單線程嗎?

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

    Yang_River 評論0 收藏0

發(fā)表評論

0條評論

liuyix

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<