第一:wait和notify方法不是线程对象的方法, 是java中任何一个java对象都有的方法,因为这两个方式是Object类自带的方法。
wait方法和notify方法不是通过线程对象调用的。
## wait()方法的作用?
Object o=new Object();
o.wait();
表示:
让正在o对象上活动的线程进入等待状态,无期限等待,
## notify()方法作用?
Object o=new Object();
o.notify();
表示:
唤醒正在o对象上等待的 线程
还有一个notifyAll()方法:
这个方法是唤醒o对象上处于等待的所有线程
生产者和消费者理解图
代码实现
package com.aaa.production;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/*
*
* 实现生产和消费者
* 一个仓库当作共享对象
* 生产者和消费者必须是线程安全的,生产出的东西需要和消费的东西的个数一致
* 有一个生产者和一个消费者
* 生产者和消费者共享一个对象
* 使用List集合当作仓库
* 仓库的数量为1
* 当仓库的数量为1时仓库就满了
* 当仓库的数量为0时仓库为空
* */
@SuppressWarnings("all")
public class Test01 {
public static void main(String[] args) {
//创建list集合
List list=new ArrayList();
//创建线程对象 两个线程共享一个list集合
Thread thread=new Thread(new Product(list));
Thread thread1=new Thread(new Consumption(list));
//为线程对象设置名称
thread.setName("生产者线程");
thread1.setName("消费者线程");
//启动线程
thread.start();
thread1.start();;
}
}
/*
* 生产者 一直生产
* */
@SuppressWarnings("all")
class Product implements Runnable{
List list;
public Product (List list){
this.list=list;
}
@Override
public void run() {
while (true) {
synchronized (list) {
//判断仓库的数量是否为空
// 如果仓库的数量不为空则代表仓库满了
// 我们就需要等待被消费
if (list.size() > 0) {
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果仓库没有满,那么就进行给仓库增加
Object object = new Object();
list.add(object);
System.out.println(Thread.currentThread().getName()+object);
//增加完之后就需要唤醒等待的线程
list.notifyAll();
}
}
}
}
/*
* 消费者 一直消费
* */
@SuppressWarnings("all")
class Consumption implements Runnable{
List list;
public Consumption (List list){
this.list=list;
}
@Override
public void run() {
while (true) {
synchronized (list) {
if (list.size() == 0) {
//仓库中已经空了
//消费者的线程等待,释放list集合的锁
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Object remove = list.remove(0);
System.out.println(Thread.currentThread().getName()+remove);
list.notifyAll();
}
}
}
}