wait()、notify()、notifyAll()方法
Object类里面提供了这几个方法:
wait():让当前线程处于等待(阻塞状态),直到其他线程调用此对象的notify()或notifyAll()方法(进入就绪状态)。
notify():唤醒在此对象监视器上等待的单个线程。
notifyAll():唤醒在此对象监视器上等待的所有线程。
每个方法都有finnal关键字修饰。
为什么这些方法要定义在Object类里,而不定义在Thread类里呢?
因为这些方法的调用必须通过锁对象调用,而锁对象可以是任意对象。所以定义在Object类里。
一个生产者—消费者问题
同一资源(共享数据):一个学生对象;设置学生对象的数据(生产者);获取学生对象的数据(消费者)。
考虑正常情况:
生产者:如果没有数据,则生产数据,生产完后通知消费者来消费数据;如果有,则自己等待;
消费者:如果有数据,则使用数据;如果没有,则自己等待,同时唤醒生产者生产数据。
###生产者-消费者问题之——采用等待唤醒机制解决
public class Student {
String name;
int age;
boolean flag;//默认初始化为flase 表示没有数据(姓名年龄)
}
//SetThread.java
public class SetThread implements Runnable {
private Student s;
private int x = 0;
public SetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
synchronized (s) { //锁:同一个对象:s
//已有数据了,则等待
if (s.flag) {
try {
s.wait()