Object類(lèi)wait及notify方法原理實(shí)例解析
Object類(lèi)中的wait和notify方法(生產(chǎn)者和消費(fèi)者模式) 不是通過(guò)線(xiàn)程調(diào)用
- wait(): 讓正在當(dāng)前對(duì)象上活動(dòng)的線(xiàn)程進(jìn)入等待狀態(tài),無(wú)期限等待,直到被喚醒為止
- notify(): 讓正在當(dāng)前對(duì)象上等待的線(xiàn)程喚醒
- notifyAll(): 喚醒當(dāng)前對(duì)象上處于等待的所有線(xiàn)程
生產(chǎn)者和消費(fèi)者模式 生產(chǎn)線(xiàn)程和消費(fèi)線(xiàn)程達(dá)到均衡
wait方法和notify方法建立在synchronized線(xiàn)程同步的基礎(chǔ)之上
- wait方法: 釋放當(dāng)前對(duì)象占有的鎖
- notify方法: 通知,不會(huì)釋放鎖
實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者模式 倉(cāng)庫(kù)容量為10
代碼如下
import java.util.ArrayList; public class Test_14 { public static void main(String[] args) { ArrayList list = new ArrayList(); Thread t1 = new Thread(new ProducerThread(list)); t1.setName("producer"); Thread t2 = new Thread(new ConsumerThread(list)); t2.setName("consumer"); t1.start(); t2.start(); } } //生產(chǎn)者線(xiàn)程 class ProducerThread implements Runnable{ private ArrayList arrayList; public ProducerThread(ArrayList arrayList) { this.arrayList = arrayList; } @Override public void run() { while (true) { synchronized (arrayList) { if (arrayList.size() > 9){ try { arrayList.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } arrayList.add(new Object()); System.out.println(Thread.currentThread().getName() + "---> 生產(chǎn)" + "---庫(kù)存" + arrayList.size()); arrayList.notify(); } } } } //消費(fèi)者線(xiàn)程 class ConsumerThread implements Runnable{ private ArrayList arrayList; public ConsumerThread(ArrayList arrayList) { this.arrayList = arrayList; } @Override public void run() { while (true){ synchronized (arrayList){ if (arrayList.size() < 9){ try { arrayList.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } arrayList.remove(0); System.out.println(Thread.currentThread().getName() + "---> 消費(fèi)" + "---庫(kù)存" + arrayList.size()); arrayList.notify(); } } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java多線(xiàn)程通信wait()和notify()代碼實(shí)例
- Java object wait notify notifyAll代碼解析
- Java多線(xiàn)程中的wait/notify通信模式實(shí)例詳解
- 分析java并發(fā)中的wait notify notifyAll
- java wait()/notify() 實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式詳解
- 基于線(xiàn)程的wait和notify使用,生產(chǎn)消費(fèi)案例
- 聊聊Object類(lèi)中的wait()和notify()方法
- Java如何正確的使用wait-notify方法你知道嗎
- 為什么wait和notify必須放在synchronized中使用
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之雙向鏈表
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開(kāi)始,都可以很方便地訪(fǎng)問(wèn)它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。本文將為大家詳細(xì)介紹雙向鏈表的特點(diǎn)與使用,需要的可以參考一下2021-12-12Spring工廠(chǎng)方法創(chuàng)建(實(shí)例化)bean實(shí)例代碼
這篇文章主要介紹了Spring工廠(chǎng)方法創(chuàng)建bean實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01java中進(jìn)程與線(xiàn)程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)
下面小編就為大家?guī)?lái)一篇java中進(jìn)程與線(xiàn)程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06講解Java中的基礎(chǔ)類(lèi)庫(kù)和語(yǔ)言包的使用
這篇文章主要介紹了Java中的基礎(chǔ)類(lèi)庫(kù)和語(yǔ)言包的使用,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09spring boot 注入 property的三種方式(推薦)
這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下2017-07-07使用lombok@Data存在extends時(shí)需要注意的問(wèn)題
在Java編程中,正確實(shí)現(xiàn)equals方法是保證對(duì)象比較一致性的關(guān)鍵,使用instanceof檢查類(lèi)型可能導(dǎo)致違反對(duì)稱(chēng)性原則,即當(dāng)子類(lèi)和父類(lèi)都重寫(xiě)equals時(shí)可能出現(xiàn)a.equals(b)不等于b.equals(a)的情況,Lombok的@EqualsAndHashCode注解可以通過(guò)callSuper=true參數(shù)2024-10-10spring項(xiàng)目如何配置多數(shù)據(jù)源(已上生產(chǎn),親測(cè)有效)
這篇文章主要介紹了spring項(xiàng)目如何配置多數(shù)據(jù)源(已上生產(chǎn),親測(cè)有效),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12