Object類wait及notify方法原理實(shí)例解析
Object類中的wait和notify方法(生產(chǎn)者和消費(fèi)者模式) 不是通過線程調(diào)用
- wait(): 讓正在當(dāng)前對(duì)象上活動(dòng)的線程進(jìn)入等待狀態(tài),無期限等待,直到被喚醒為止
- notify(): 讓正在當(dāng)前對(duì)象上等待的線程喚醒
- notifyAll(): 喚醒當(dāng)前對(duì)象上處于等待的所有線程
生產(chǎn)者和消費(fèi)者模式 生產(chǎn)線程和消費(fèi)線程達(dá)到均衡
wait方法和notify方法建立在synchronized線程同步的基礎(chǔ)之上
- wait方法: 釋放當(dāng)前對(duì)象占有的鎖
- notify方法: 通知,不會(huì)釋放鎖
實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者模式 倉庫容量為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)者線程
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)" + "---庫存" + arrayList.size());
arrayList.notify();
}
}
}
}
//消費(fèi)者線程
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)" + "---庫存" + arrayList.size());
arrayList.notify();
}
}
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java多線程通信wait()和notify()代碼實(shí)例
- Java object wait notify notifyAll代碼解析
- Java多線程中的wait/notify通信模式實(shí)例詳解
- 分析java并發(fā)中的wait notify notifyAll
- java wait()/notify() 實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式詳解
- 基于線程的wait和notify使用,生產(chǎn)消費(fèi)案例
- 聊聊Object類中的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)開始,都可以很方便地訪問它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。本文將為大家詳細(xì)介紹雙向鏈表的特點(diǎn)與使用,需要的可以參考一下2021-12-12
Spring工廠方法創(chuàng)建(實(shí)例化)bean實(shí)例代碼
這篇文章主要介紹了Spring工廠方法創(chuàng)建bean實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)
下面小編就為大家?guī)硪黄猨ava中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
spring boot 注入 property的三種方式(推薦)
這篇文章主要介紹了spring boot 注入 property的三種方式,需要的朋友可以參考下2017-07-07
使用lombok@Data存在extends時(shí)需要注意的問題
在Java編程中,正確實(shí)現(xiàn)equals方法是保證對(duì)象比較一致性的關(guān)鍵,使用instanceof檢查類型可能導(dǎo)致違反對(duì)稱性原則,即當(dāng)子類和父類都重寫equals時(shí)可能出現(xiàn)a.equals(b)不等于b.equals(a)的情況,Lombok的@EqualsAndHashCode注解可以通過callSuper=true參數(shù)2024-10-10
spring項(xiàng)目如何配置多數(shù)據(jù)源(已上生產(chǎn),親測(cè)有效)
這篇文章主要介紹了spring項(xiàng)目如何配置多數(shù)據(jù)源(已上生產(chǎn),親測(cè)有效),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

