waithe notify方法不是线程对象的方法,是java中任何一个java对象都有的方法,这两个方法是Object类中自带的
wait()方法和notify()方法的作用
wait()方法
Object o = new Object();
o.wait(); //表示让正在o对象上活动的线程(当前线程)进入等待状态,无期限等待,直到被唤醒为止
notify()方法
//将在o对象上等待的线程唤醒
o.notify();//唤醒o对象上正在等待的线程
wait()方法会让正在该对象上戳东的当前线程进入等待状态,并且释放之前占有的该对象的锁
notify()方法只会通知,不会释放之前战友的该对象的锁
生产者和消费者模式是为了专门解决某个特点需求
使用wait()方法和notify()方法实现“生产者和消费者模式”
代码实例:
package com.bjpowernode.java.threada;
import java.util.ArrayList;
import java.util.List;
public class ThreadTest16 {
public static void main(String[] args) {
//创建1个共享的仓库对象
List list = new ArrayList();
//创建两个线程对象
//生产者线程
Thread t1 = new Thread(new Producer(list));
//消费者线程
Thread t2 = new Thread(new Consumer(list));
t1.start();
t2.start();
}
}
//生产线程
class Producer implements Runnable {
//仓库
private List list;
public Producer(List list){
this.list=list;
}
@Override
public void run() {
//一直生产:使用死循环模拟一直生产
while(true){
//给仓库对象list枷锁
synchronized (list){
//大于0说明仓库中已经有1个元素了,当前线程进入等待状态,并且释放list集合的锁
if(list.size() > 0){
try {
list.wait();
}catch (InterruptedException e){
}
}
//否则仓库是空的可以生产
Object obj = new Object();
list.add(obj);
System.out.println(Thread.currentThread().getName() + "--->" +obj);
//唤醒消费者消费
list.notify();
}
}
}
}
//消费线程
class Consumer implements Runnable {
private List list;
public Consumer(List list){
this.list=list;
}
@Override
public void run(){
//一直消费
while (true){
synchronized (list){
if(list.size() == 0 ){
try{
//仓库空了,消费者线程等待,释放list集合的锁
list.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
//仓库中有数据,进行消费
Object obj = list.remove(0);
System.out.println(Thread.currentThread().getName() + "--->" + obj);
//唤醒生产者生产
list.notify();
}
}
}
}