等待通知机制
满足生产者和消费者模式
线程A,拿到了对象object的锁,并且调用了object的wait()方法,同时释放了锁,然后进入WAITTING状态。线程B同样前提是拿到了object的锁,然后调用了notify()或notifyAll()方法,线程A收到了线程B的通知后,从wait()方法上返回,继续执行它的操作。
等待通知机制核心方法:Java的相关 等待/通知 相关方法是所有对象都有的方法,因为这些方法被定义在超类Object中。具体的方法有notify(),notifyAll(),wait()等。
具体的解释说明为:
- notify():该线程获取到了对象的锁和CPU,释放此线程,让它从wait()方法返回
- notifyAll():与notify()类似,不过是释放所有在等待队列中的线程
- wait():一个线程如果调用了这个方法,线程将进入WAITTING状态,并且会将锁和CPU释放
注意:在实际开发中对于notify()和notifyAll()的选用,实际上多选用notifyAll()。
因为在Java中每一个Object对象都有一个等待队列,该对象调用wait()方法后,线程会自动进入等待队列,并且所有的线程都是在同一个等待队列中,因此如果对象调用notify()方法,系统会随机释放线程,仍然会造成阻塞,如果是释放notifyAll()方法,会释放等待队列中所有的线程,所以一定会释放出获取了系统CPU和对象锁标记的线程,便能完成线程间的通信,使程序完整进行。
下面是一个详细的例子
package com.it.thread;
public class TestProductConsum {
public static void main(String[] args) {
myStack myStack = new myStack();
//用于生产的线程
Runnable task1 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(char c='A';c<'Z';c++){
//进栈操作,往栈中添加26个英文字母
myStack.push(c+"");
}
}
};
//用于消费的线程
Runnable task2=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1;i<=26;i++) {
//出栈操作,读出26个字母
myStack.pop();
}
}
};
new Thread(task1).start();
new Thread(task2).start();
}
}
class myStack{
String[] data= {"","","","","",""};
int index;//记录数组有几个元素
//进栈
public synchronized void push(String s) {
//当数组长度等于数组中元素的个数时,生产者线程不能再进行生产,调用wait,失去CPU和锁标记,由消费者线程获得
while (data.length==index) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.print(s+" pushed ");
data[index]=s;
index++;
print();
this.notifyAll();//通知消费者,让消费者进行工作。
}
//出栈
public synchronized void pop() {
//当栈中无元素时,证明全部出栈,此时停止消费者线程,该线程失去CPU和锁标记,由生产者线程获得
while(index==0) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
index--;
String o = data[index];
data[index]="";
System.out.print(o+" poped ");
print();
this.notifyAll();//通知生产者
}
public void print() {
for(int i=0;i<data.length;i++)
{
System.out.print(data[i]+" ");
}
System.out.println();
}
}

本文介绍Java中等待通知机制的核心概念及其实现方式,通过生产者和消费者模式,详细解析了wait(), notify() 和 notifyAll() 方法的使用场景及其作用。
2202

被折叠的 条评论
为什么被折叠?



