java 關于 Object 類中的 wait 和 notify 方法。(生產者和消費者模式!)

4、關于 Object 類中的 wait 和 notify 方法。(生產者和消費者模式!)
第一:wait 和 notify 方法不是線程對象的方法,是 java 中任何一個 java 對象都有的方法,因為這兩個方法是 Object 類中自帶的。
wait 方法和 notify 方法不是通過線程對象調用的。
第二:wait() 方法作用?
Object o = new Object();
o.wait();
表示:讓正在 o 對象上活動的線程進入等待狀態,無期限等待,直到被喚醒為止。
o.wait(); 方法的調用,會讓“當前線程(正在 o 對象上活動的線程)”進入等待狀態。
第三:notify方法作用?
Object o = new Object();
o.notify();
表示:喚醒正在 o 對象上等待的線程。

notifyAll() 方法:
這個方法是喚醒 o 對象上處于等待的所有線程。

例:
package com.su.test.threadtest;

import java.util.ArrayList;
import java.util.List;

/**

  • @author : sumeiping
  • @date : 2022-02-01 16:41
  • 1、使用 wait 方法和 notify 方法實現“生產者和消費者模式”
  • 2、什么是“生產者和消費者模式”
  •  生產線程負責生產,消費線程負責消費。
    
  •  生產線程和消費線程要達到均衡。
    
  •  這是一種特殊的業務需求,在這種特殊的情況下要使用 wait 方法和 notify 方法。
    
  • 3、wait 和 notify 方法不是線程對象的方法,是普通 java 對象都有的方法。java.lang.Object 根類
  • 4、wait 方法和 notify 方法建立在線程同步的基礎之上。因為多線程要同時操作一個倉庫。有線程安全問題。
  • 5、wait 方法作用:o.wait() 讓正在 o 對象上活動的線程 t 進入等待狀態,并且釋放掉 t 線程之前占有的 o 對象的鎖。
  • 6、notify 方法作用:o.notify() 讓正在 o 對象上等待的線程喚醒,只是通知,不會釋放 o 對象上之前占有的鎖。
  • 7、模擬這樣一個需求:
  •  倉庫我們采用 List 集合。
    
  •  List 集合中假設只能存儲 1 個元素。
    
  •  1 個元素就表示倉庫滿了。
    
  •  如果 List 集合中元素個數是 0,就表示倉庫空了。
    
  •  保證 List 集合中永遠都是最多存儲 1 個元素。
    
  •  必須做到這種效果:生產 1 個消費 1 個。
    

*/
public class WaitNotify {
public static void main(String[] args) {
// 創建一個倉庫對象,共享的。
List list = new ArrayList();

    // 創建2個線程對象// 生產者線程對象Thread t1 = new Thread(new Producer(list));t1.setName("生產者線程");// 消費者線程對象Thread t2 = new Thread(new Consumer(list));t2.setName("消費者線程");// 啟動線程t1.start();t2.start();/*** 生產者線程--->java.lang.Object@47a2a66c* 消費者線程--->java.lang.Object@47a2a66c* 倉庫已經空了* 生產者線程--->java.lang.Object@496550e8* 消費者線程--->java.lang.Object@496550e8* 倉庫已經空了* 生產者線程--->java.lang.Object@4d5acd1c* 倉庫已經有1個元素了* 消費者線程--->java.lang.Object@4d5acd1c* 倉庫已經空了* 生產者線程--->java.lang.Object@8585ad3* 倉庫已經有1個元素了* 消費者線程--->java.lang.Object@8585ad3* 生產者線程--->java.lang.Object@5a9b1c72* 消費者線程--->java.lang.Object@5a9b1c72* 生產者線程--->java.lang.Object@399af5d9* 倉庫已經有1個元素了* 消費者線程--->java.lang.Object@399af5d9* 生產者線程--->java.lang.Object@22b3eddb* 倉庫已經有1個元素了* 消費者線程--->java.lang.Object@22b3eddb* 倉庫已經空了* 生產者線程--->java.lang.Object@6877a59c* ..........*/
}

}
// 生產線程
class Producer implements Runnable{
// 倉庫
private List list;
public Producer(){}

public Producer(List list) {this.list = list;
}@Override
public void run() {// 一直生產(使用死循環來模擬一直生產)while (true){// 給倉庫對象list加鎖synchronized (list){if (list.size() > 0){   // 大于 0,說明倉庫中已經有 1 個元素了。System.out.println("倉庫已經有1個元素了");try {list.wait();    // 當線程進入等待狀態,并且釋放 Producer 之前占有的 list 集合的鎖。} catch (InterruptedException e) {e.printStackTrace();}}// 程序執行到這來說明倉庫是空的,可以生產Object obj = new Object();list.add(obj);System.out.println(Thread.currentThread().getName() + "--->" + obj);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 喚醒消費者進行消費//list.notify();list.notifyAll();}}
}

}
// 消費線程
class Consumer implements Runnable{
private List list;
public Consumer(){}

public Consumer(List list){this.list = list;
}@Override
public void run() {// 一直消費while (true){synchronized (list){if (list.size() == 0){System.out.println("倉庫已經空了");try {list.wait();    // 倉庫已經空了。消費者線程等待,釋放掉 list 集合的鎖} catch (InterruptedException e) {e.printStackTrace();}}// 程序執行到這里說明倉庫中有數據,可以消費Object obj = list.remove(0);System.out.println(Thread.currentThread().getName() + "--->" + obj);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 喚醒生產者進行生產//list.notify();list.notifyAll();}}
}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719724.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的停車位檢測系統(Python+PySide6界面+訓練代碼)

摘要:開發停車位檢測系統對于優化停車資源管理和提升用戶體驗至關重要。本篇博客詳細介紹了如何利用深度學習構建一個停車位檢測系統,并提供了完整的實現代碼。該系統基于強大的YOLOv8算法,并結合了YOLOv7、YOLOv6、YOLOv5的性能對比&#xf…

HarmonyOS端云體化開發—創建端云一體化開發工程

云開發工程模板 DevEco Studio目前提供了兩種云開發工程模板:通用云開發模板和商城模板。您可根據工程向導輕松創建端云一體化開發工程,并自動生成對應的代碼和資源模板。在創建端云一體化開發工程前,請提前了解云開發工程模板的相關信息。 …

前端學習之HTML(第一天)

什么是HTML HTML是一種用來描述網頁的一種語言&#xff0c;HTML不是一種編程語言&#xff0c;而是一種標記語言。 HTML標簽 HTML 標簽是由尖括號包圍的關鍵詞&#xff0c;比如 <html> HTML 標簽通常是成對出現的&#xff0c;比如 <b> 和 </b> 標簽對中的…

ROS 2基礎概念#3:主題(Topic)| ROS 2學習筆記

在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;主題&#xff08;Topics&#xff09;是實現節點之間通信的主要機制之一。節點&#xff08;Node&#xff09;可以發布&#xff08;publish&#xff09;消息到話題&#xff0c;或者訂閱&#xff08;subscribe&…

市場復盤總結 20240304

僅用于記錄當天的市場情況&#xff0c;用于統計交易策略的適用情況&#xff0c;以便程序回測 短線核心&#xff1a;不參與任何級別的調整&#xff0c;采用龍空龍模式 一支股票 10%的時候可以操作&#xff0c; 90%的時間適合空倉等待 二進三&#xff1a; 進級率中 20% 最常用的…

格兩例12345

osu/Lucky Roll gaming 周末osu有道題&#xff1a;lcg已知低位 def lcg(s, a, b, p):return (a * s b) % pp getPrime(floor(72.7)) a randrange(0, p) b randrange(0, p) seed randrange(0, p) print(f"{p }") print(f"{a }") print(f"{b …

冪等性設計

目錄 前言 冪等性設計 冪等性設計處理流程 HTTP 冪等性 消息隊列冪等性 基于kafka 前言 冪等性設計&#xff0c;就是說&#xff0c;一次和多次請求某一個資源應該具有同樣的副作用。為什么我們要有冪等性操作&#xff1f;說白了&#xff0c;就兩點&#xff1a;1、網絡的…

LeetCode第125場雙周賽個人題解

目錄 100231. 超過閾值的最少操作數 I 原題鏈接 思路分析 AC代碼 100232. 超過閾值的最少操作數 II 原題鏈接 思路分析 AC代碼 100226. 在帶權樹網絡中統計可連接服務器對數目 原題鏈接 思路分析 AC代碼 100210. 最大節點價值之和 原題鏈接 思路分析 AC代碼 10023…

大話C++之:對象內存模型

一般繼承(無虛函數覆蓋) 只有一個虛指針&#xff0c;指向一個虛表&#xff0c;虛函數按順序從祖先節點開始插入到虛表上。字段按順序從祖先節點開始插入到對象內存上 一般繼承(有虛函數覆蓋) 只有一個虛指針&#xff0c;指向一個虛表&#xff0c;虛函數按順序從祖先節點開始&a…

桂院校園導航 靜態項目 二次開發教程 2.0

Gitee代碼倉庫&#xff1a;桂院校園導航小程序 GitHub代碼倉庫&#xff1a;GLU-Campus-Guide 靜態項目 2.0版本 升級日志 序號 板塊 詳情 1 首頁 重做了首頁&#xff0c;界面更加高效和美觀 2 校園頁 新增了 “校園指南” 功能&#xff0c;可以搜索和瀏覽校園生活指南…

【金三銀四】每日一點面試題(Java--JVM篇)

1、說一下 JVM 的主要組成部分及其作用&#xff1f; JVM&#xff08;Java虛擬機&#xff09;是Java程序運行的核心組件&#xff0c;它負責將Java字節碼翻譯成底層操作系統能夠執行的指令。JVM由以下幾個主要組成部分構成&#xff1a; 類加載器&#xff08;Class Loader&#…

Modbus協議詳細解析與案例分享

目錄 Modbus協議詳細解析與案例分享1. Modbus協議簡介2. Modbus RTU和Modbus TCP的區別3. Modbus幀結構4. Modbus協議示例5. Modbus應用場景結語 Modbus協議詳細解析與案例分享 1. Modbus協議簡介 Modbus是一種串行通信協議&#xff0c;用于實現工業自動化設備之間的通信。它…

消息中間件|初識消息隊列

文章目錄 消息隊列是什么&#xff1f;消息隊列關鍵概念消息隊列優點消息隊列的應用場景異步處理應用解耦流量削峰消息通訊 常用消息隊列中間件的對比 消息隊列是什么&#xff1f; 消息隊列&#xff08;Message Queue&#xff09;是一種用于在軟件系統之間傳遞消息的通信機制。…

spring boot概述

SpringBoot是由Pivotal團隊提供的全新框架&#xff0c;其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。 該框架使用了特定的方式來進行配置&#xff0c;從而使開發人員不再需要定義樣板化的配置。 通過這種方式&#xff0c;SpringBoot致力于在蓬勃發展的快速應用開發…

實時抓取SKU商品屬性詳細信息API數據接口(淘寶,某音)

item_sku-獲取sku詳細信息 taobao.item_sku詳細信息 API公共參數 請求地址: https://api-gw.onebound.cn/taobao/item_sku 名稱類型必須描述keyString是調用key&#xff08;演示示例&#xff09;secretString是調用密鑰api_nameString是API接口名稱&#xff08;包括在請求地…

設計模式學習筆記 - 設計原則 - 3.里氏替換原則,它和多態的區別是什么?

前言 今天來學習 SOLID 中的 L&#xff1a;里氏替換原則。它的英文翻譯是 Liskov Substitution Principle&#xff0c;縮寫為 LSP。 英文原話是&#xff1a; Functions that use points of references of base classes must be able to use objects of derived classes withou…

python-分享篇-生成仿微信公眾號推廣的個性二維碼(支持動態)

代碼 生成仿微信公眾號推廣的個性二維碼&#xff08;支持動態&#xff09;from MyQR import myqr # 要生成動態二維碼&#xff0c;只需要將piture參數和save_name參數設置gif動圖即可 myqr.run(wordshttps://blog.csdn.net/stqer/article/details/135553200, # 指定二維碼包含…

JVM(內存區域劃分)

JVM JVM - Java虛擬機 我們編寫的 Java 程序, 是不能夠被 OS 直接識別的 JVM 充當翻譯官的角色, 負責把我們寫的的 Java 程序 ,翻譯給 OS “聽”, 讓 OS 能夠識別我們所寫的 Java 代碼 JVM 內存區域劃分 JVM 是一個應用程序, 在啟動的時候, 會從 操作系統 申請到一整塊很大的內…

AI-RAN聯盟在MWC24上正式啟動

AI-RAN聯盟在MWC24上正式啟動。它的logo是這個樣的&#xff1a; 2月26日&#xff0c;AI-RAN聯盟&#xff08;AI-RAN Alliance&#xff09;在2024年世界移動通信大會&#xff08;MWC 2024&#xff09;上成立。創始成員包括亞馬遜云科技、Arm、DeepSig、愛立信、微軟、諾基亞、美…

【dc-dc】AP510X單路低壓差線性恒流芯片

說明 AP510X 是一系列外圍電路簡潔的單路線性 LED 恒 流芯片&#xff0c;適用于 3-60V 電壓范圍的 LED 恒流調光 領域。 AP510X 采用我司專利算法&#xff0c;可以實現高精度的恒 流效果&#xff0c;輸出電流恒流精度≤ 3 &#xff05;&#xff0c;電源供電工作 范…