日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

線程通訊的三種方法!通俗易懂

來源: 責編: 時間:2023-08-05 11:44:31 11886觀看
導讀線程通信是指多個線程之間通過某種機制進行協(xié)調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下的 wait()、notify() 和 notifyAll() 方法;C

線程通信是指多個線程之間通過某種機制進行協(xié)調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 ZCC28資訊網——每日最新資訊28at.com

在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:ZCC28資訊網——每日最新資訊28at.com

  1. Object 類下的 wait()、notify() 和 notifyAll() 方法;
  2. Condition 類下的 await()、signal() 和 signalAll() 方法;
  3. LockSupport 類下的 park() 和 unpark() 方法。

為什么一個線程等待和通知機制就需要這么多的實現(xiàn)方式呢?ZCC28資訊網——每日最新資訊28at.com

別著急,咱們先來看實現(xiàn),再來說原因。ZCC28資訊網——每日最新資訊28at.com

一、wait/notify/notifyAll

Object 類的方法說明:ZCC28資訊網——每日最新資訊28at.com

  1. wait():讓當前線程處于等待狀態(tài),并釋放當前擁有的鎖;
  2. notify():隨機喚醒等待該鎖的其他線程,重新獲取鎖,并執(zhí)行后續(xù)的流程,只能喚醒一個線程;
  3. notifyAll():喚醒所有等待該鎖的線程(鎖只有一把,雖然所有線程被喚醒,但所有線程需要排隊執(zhí)行)。

示例代碼如下:ZCC28資訊網——每日最新資訊28at.com

Object lock = new Object();// 創(chuàng)建線程并執(zhí)行new Thread(() -> {    System.out.println("線程1:開始執(zhí)行");    synchronized (lock) {        try {            System.out.println("線程1:進入等待");            lock.wait();            System.out.println("線程1:繼續(xù)執(zhí)行");            Thread.sleep(3000);        } catch (InterruptedException e) {            throw new RuntimeException(e);        }        System.out.println("線程1:執(zhí)行完成");    }}).start();Thread.sleep(1000);synchronized (lock) {    // 喚醒線程    System.out.println("執(zhí)行 notifyAll()");    lock.notifyAll();}

二、await/signal/signalAll

Condition 類的方法說明:ZCC28資訊網——每日最新資訊28at.com

  1. await():對應 Object 的 wait() 方法,線程等待;
  2. signal():對應 Object 的 notify() 方法,隨機喚醒一個線程;
  3. signalAll():對應 Object 的 notifyAll() 方法,喚醒所有線程。

示例代碼如下:ZCC28資訊網——每日最新資訊28at.com

// 創(chuàng)建 Condition 對象Lock lock = new ReentrantLock();Condition condition = lock.newCondition(); // lock 下可創(chuàng)建多個 Condition// 加鎖lock.lock();try {    // 業(yè)務方法......    // 1.進入等待狀態(tài)    condition.await();    // 2.喚醒操作    condition.signal();} catch (InterruptedException e) {    e.printStackTrace();} finally {    lock.unlock();}

三、park/unpark

LockSupport 類的方法說明:ZCC28資訊網——每日最新資訊28at.com

  1. LockSupport.park():休眠當前線程。
  2. LockSupport.unpark(線程對象):喚醒某一個指定的線程。

PS:LockSupport 無需配鎖(synchronized 或 Lock)一起使用。ZCC28資訊網——每日最新資訊28at.com

示例代碼如下:ZCC28資訊網——每日最新資訊28at.com

public static void main(String[] args) throws InterruptedException {    Thread t1 = new Thread(() -> {        LockSupport.park();        System.out.println("線程1");    }, "線程1");    t1.start();    Thread t2 = new Thread(() -> {        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("喚醒線程1");        LockSupport.unpark(t1);    }, "線程2");    t2.start();}

四、小結

為什么一個線程等待和喚醒的功能需要這么多的實現(xiàn)呢?ZCC28資訊網——每日最新資訊28at.com

  1. LockSupport 存在的必要性:前兩種方法 notify 方法以及 signal 方法都是隨機喚醒,如果存在多個等待線程的話,可能會喚醒不應該喚醒的線程,因此有 LockSupport 類下的 park 和 unpark 方法指定喚醒線程是非常有必要的。
  2. Condition 存在的必要性:Condition 相比于 Object 類的 wait 和 notify/notifyAll 方法,前者可以創(chuàng)建多個等待集,例如,我們可以創(chuàng)建一個生產者等待喚醒對象,和一個消費者等待喚醒對象,這樣我們就能實現(xiàn)生產者只能喚醒消費者,而消費者只能喚醒生產者的業(yè)務邏輯了,如下代碼所示:
// 創(chuàng)建 Condition 對象private Lock lock = new ReentrantLock();// 生產者的 Condition 對象private Condition producerCondition = lock.newCondition();// 本篇內容出自磊哥《Java面試突擊訓練營》 VX:GG_Stone// 消費者的 Condition 對象private Condition consumerCondition = lock.newCondition();

也就是 Condition 是 Object 等待喚醒模型的升級,Object 類可以實現(xiàn)的功能它都能實現(xiàn),但 Condition 能實現(xiàn)的功能,Object 卻不能實現(xiàn),這就是 Condition 類存在的必要性。ZCC28資訊網——每日最新資訊28at.com

那問題來了,為什么還有會 Object 的 wait 和 notify 方法呢?因為 Object 類誕生的比較早,也就是說 Condition 和 LockSupport 都是 JDK 后期版本才出現(xiàn)的功能,所以就有了現(xiàn)在這么多線程喚醒和等待的方法了。ZCC28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-77-0.html線程通訊的三種方法!通俗易懂

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 十個可以手動編寫的 JavaScript 數(shù)組 API

下一篇: Rust中的高吞吐量流處理

標簽:
  • 熱門焦點
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產品是什么?——是智能音箱。 手機在執(zhí)行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數(shù)據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新?lián)Q代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現(xiàn)已正式出爐,冠軍是來自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從“最美JK”起到“最美女星&r
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協(xié)調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 機構稱Q2國內智能手機銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據市場調查機構Counterpoint Research公布的最新報告,2023年第2季度中國智能手機銷量同比下降4%,創(chuàng)新自2014年以來第2季度銷量新低。報
  • Counterpoint :OPPO雙旗艦戰(zhàn)略全面落地 高端產品銷量增長22%

    2023年6月30日,全球行業(yè)分析機構Counterpoint Research發(fā)布的《中國智能手機高端市場白皮書》顯示,中國智能手機品牌正在尋求高質量發(fā)展,中國高端智能
  • 微軟發(fā)布Windows 11新版 引入全新任務欄狀態(tài)

    近日,微軟發(fā)布了Windows 11新版,而Build 22563更新主要引入了幾周前曝光的平板模式任務欄等,系統(tǒng)更流暢了。更新中,Windows 11加入了專門針對平板優(yōu)化的任務欄
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續(xù)還將開展常態(tài)化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 镇沅| 安塞县| 博野县| 台前县| 武夷山市| 玉门市| 定结县| 华亭县| 鞍山市| 南投市| 迁安市| 土默特右旗| 屏山县| 东乌珠穆沁旗| 灵璧县| 香港| 永城市| 沈阳市| 松溪县| 桐梓县| 清远市| 祁门县| 渝中区| 东丰县| 竹北市| 连云港市| 东乡族自治县| 濉溪县| 东乡县| 蒙城县| 濮阳市| 景泰县| 油尖旺区| 海淀区| 香格里拉县| 沙田区| 诸城市| 靖西县| 阳朔县| 台安县| 肇庆市|