語音社交原始碼開發,兩個執行緒按照指定方式有序相交的實現

雲豹科技程式設計師發表於2021-12-17
在語音社交原始碼的執行當中,會有很多執行緒會在系統中進行,對於不同的執行緒我們希望實現不同的效果,今天我們主要來了解一下如何讓兩個執行緒按照指定的方式有序相交。
如果現在我們希望 B執行緒在 A 執行緒列印 1 後立即列印 1,2,3,然後 A 執行緒繼續列印 2,3,那麼我們需要更細粒度的鎖來控制執行順序。
在這裡,我們可以利用 object.wait() 和 object.notify() 方法,程式碼如下:
public static void demo3() {
    Object lock = new Object();
    Thread A = new Thread(() -> {
        synchronized (lock) {
            System.out.println("A 1");
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("A 2");
            System.out.println("A 3");
        }
    });
    Thread B = new Thread(() -> {
        synchronized (lock) {
            System.out.println("B 1");
            System.out.println("B 2");
            System.out.println("B 3");
            lock.notify();
        }
    });
    A.start();
    B.start();
}
得到的結果如下:
A 1
B 1
B 2
B 3
A 2
A 3
上述程式碼的執行流程如下:
首先我們在語音社交原始碼中建立一個由 A 和 B 共享的物件鎖: lock = new Object(); 當A拿到鎖時,先列印1,然後呼叫lock.wait()方法進入等待狀態,然後交出鎖的控制權; B 不會被執行,直到 A 呼叫該lock.wait()方法釋放控制權並且 B 獲得鎖; B拿到鎖後列印1,2,3,然後呼叫lock.notify()方法喚醒正在等待的A; A 喚醒後繼續列印剩餘的 2,3。 為了便於理解,我將上面的程式碼新增了日誌,程式碼如下:
public static void demo3() {
    Object lock = new Object();
    Thread A = new Thread(() -> {
        System.out.println("INFO:A 等待獲取鎖");
        synchronized (lock) {
            System.out.println("INFO:A 獲取到鎖");
            System.out.println("A 1");
            try {
                System.out.println("INFO:A 進入 waiting 狀態,放棄鎖的控制權");
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("INFO:A 被 B 喚醒繼續執行");
            System.out.println("A 2");
            System.out.println("A 3");
        }
    });
    Thread B = new Thread(() -> {
        System.out.println("INFO:B 等待獲取鎖");
        synchronized (lock) {
            System.out.println("INFO:B 獲取到鎖");
            System.out.println("B 1");
            System.out.println("B 2");
            System.out.println("B 3");
            System.out.println("INFO:B 執行結束,呼叫 notify 方法喚醒 A");
            lock.notify();
        }
    });
    A.start();
    B.start();
}
得到的結果如下:
INFO:A 等待獲取鎖
INFO:A 獲取到鎖
A 1
INFO:A 進入 waiting 狀態,放棄鎖的控制權
INFO:B 等待獲取鎖
INFO:B 獲取到鎖
B 1
B 2
B 3
INFO:B 執行結束,呼叫 notify 方法喚醒 A
INFO:A 被 B 喚醒繼續執行
A 2
A 3
以上便是“語音社交原始碼開發,兩個執行緒按照指定方式有序相交的實現”的主要程式碼,希望對大家有幫助。
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理 原文連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2848351/,如需轉載,請註明出處,否則將追究法律責任。

相關文章