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

