- wait()和notify()方法建立在线程安全的基础上,必须在synchronized 代码块里执行,且成对 出现
- 两个方法不是thread的方法,是java的方法
- 当调用wait() 方法后,当前线程(t线程)立刻进入无限等待状态,并且 释放当前线程占有的锁
- 直到调用notify() 方法,才可以让t线程唤醒
- notify() 方法只会通知,不会释放锁
- 先wait后notify程序才能被唤醒,否则程序一直无法结束
public class ThreadTest11 {
public static void main(String[] args) {
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){
synchronized (list) {
if (list.size() > 0) {
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Object obj = new Object();
list.add(obj);
System.out.println(Thread.currentThread().getName()+"--->"+obj);
list.notify();
System.out.println("生产者");
}
}
}
}
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.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Object obj = list.remove(0);
System.out.println(Thread.currentThread().getName()+"--->"+obj);
list.notify();
System.out.println("消费者");
}
}
}
}