Object類wait及notify方法原理實例解析
更新時間:2020年08月20日 10:29:51 作者:javase-->
這篇文章主要介紹了Object類wait及notify方法原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
Object類中的wait和notify方法(生產(chǎn)者和消費者模式) 不是通過線程調(diào)用
- wait(): 讓正在當前對象上活動的線程進入等待狀態(tài),無期限等待,直到被喚醒為止
- notify(): 讓正在當前對象上等待的線程喚醒
- notifyAll(): 喚醒當前對象上處于等待的所有線程
生產(chǎn)者和消費者模式 生產(chǎn)線程和消費線程達到均衡
wait方法和notify方法建立在synchronized線程同步的基礎之上
- 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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關文章
BeanUtils.copyProperties()參數(shù)的賦值順序說明
這篇文章主要介紹了BeanUtils.copyProperties()參數(shù)的賦值順序說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java 日期格式y(tǒng)yyy-MM-dd與YYYY-MM-dd區(qū)別
我們在java中常用的規(guī)范格式為:2023-11-11
yyyy-MM-dd HH:mm:ss:SSS 24小時制或yyyy-MM-dd hh:mm:ss:SSS 12小時制,本文就來介紹一下兩者的區(qū)別,感興趣的可以了解一下
使用java實現(xiàn)BBS論壇發(fā)送郵件過程詳解
這篇文章主要介紹了使用java發(fā)送郵件過程詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

