語音社交原始碼開發,兩個執行緒按照指定方式有序相交的實現
在語音社交原始碼的執行當中,會有很多執行緒會在系統中進行,對於不同的執行緒我們希望實現不同的效果,今天我們主要來了解一下如何讓兩個執行緒按照指定的方式有序相交。
如果現在我們希望 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 實現手機直播原始碼中兩個執行緒依次執行的相關程式碼原始碼執行緒
- 關於多執行緒的兩種實現方式執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- FFmpeg開發筆記(十九)FFmpeg開啟兩個執行緒分別解碼音影片筆記執行緒
- java執行緒實現方式Java執行緒
- Java中實現執行緒的方式Java執行緒
- 語音社交原始碼重啟,正在執行的任務會如何處理?原始碼
- 直播商城原始碼,android執行緒的介紹及兩種啟動方式原始碼Android執行緒
- 語音社交app開發,如何實現介面優化?APP優化
- Java多執行緒實現方式Java執行緒
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- 面試-實現多執行緒的方式面試執行緒
- 實現語音社交原始碼介面效能優化,從索引入手原始碼優化索引
- CSS實現兩個球相交的粘粘效果CSS
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- Map實現執行緒安全的3種方式執行緒
- Java實現多執行緒的三種方式Java執行緒
- 建立執行緒的方式三:實現Callable介面執行緒
- 為何語音社交app原始碼的開發始終都這麼火爆?APP原始碼
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- 【併發技術01】傳統執行緒技術中建立執行緒的兩種方式執行緒
- 執行緒池的實現原始碼及應用舉例執行緒原始碼
- 深入原始碼,深度解析Java 執行緒池的實現原理原始碼Java執行緒
- 併發程式設計之 原始碼剖析 執行緒池 實現原理程式設計原始碼執行緒
- Java多執行緒之—Synchronized方式和CAS方式實現執行緒安全效能對比Java執行緒synchronized
- Java建立多執行緒的幾種方式實現Java執行緒
- 匿名內部類方式實現執行緒的建立執行緒
- Java之實現多執行緒的方式二:實現Runnable介面Java執行緒
- 3種方式實現python多執行緒併發處理Python執行緒
- 易語言執行js的兩種方式JS
- 併發基礎-第01章-實現執行緒的正確方式執行緒
- 執行緒池的實現程式碼分析執行緒
- 語音派對系統原始碼的功能已突破現有社交格局原始碼
- OpenMP 執行緒同步 Construct 實現原理以及原始碼分析(上)執行緒Struct原始碼
- OpenMP 執行緒同步 Construct 實現原理以及原始碼分析(下)執行緒Struct原始碼
- 多執行緒程式設計-分析阻塞佇列的原始碼實現執行緒程式設計佇列原始碼
- Java併發基礎01:揭祕傳統執行緒技術中建立執行緒的兩種方式Java執行緒