wait()方法,作用是使执行当前代码的线程进行等待,wait()方法是Object类的方法,在调用wait()方法之前,线程必须获得该对象的对象级别的锁,所以只能在同步方法或同步块中使用wait()方法,一旦调用了wait()方法,则立马释放该对象锁.
notify()方法,也只能在同步方法或者在同步代码块调用,调用前,线程必须获得该对象的对象级别锁,如果调用notify()方法没有持有适当的锁,跟wait()方法一样会抛出ILLegalMonitorStateException异常,调用notify()方法后会唤醒那些可能等待该对象锁的其他线程,如果多个线程等待,随机挑选一个呈wait()状态的的线程,对其发出通知notify(),在执行notify()后,不会马上释放对象锁,呈wait()状态的线程并不能立马获得对象锁,需要等待执行notify()方法的线程将程序执行完,退出synchronized代码块后,当前线程才会释放,且呈wait状态所在的线程才可以获得对象锁继续执行后面代码,如果该对象没有再次调用notify()方法的话,其他呈wait状态的线程因为没有得到通知,所以会一直等待下去,还会阻塞在wait状态.
一句话总结就是,wai()使线程停止运行,释放对象锁,而notify()使停止的线程继续执行.
notify()方法,也只能在同步方法或者在同步代码块调用,调用前,线程必须获得该对象的对象级别锁,如果调用notify()方法没有持有适当的锁,跟wait()方法一样会抛出ILLegalMonitorStateException异常,调用notify()方法后会唤醒那些可能等待该对象锁的其他线程,如果多个线程等待,随机挑选一个呈wait()状态的的线程,对其发出通知notify(),在执行notify()后,不会马上释放对象锁,呈wait()状态的线程并不能立马获得对象锁,需要等待执行notify()方法的线程将程序执行完,退出synchronized代码块后,当前线程才会释放,且呈wait状态所在的线程才可以获得对象锁继续执行后面代码,如果该对象没有再次调用notify()方法的话,其他呈wait状态的线程因为没有得到通知,所以会一直等待下去,还会阻塞在wait状态.
一句话总结就是,wai()使线程停止运行,释放对象锁,而notify()使停止的线程继续执行.
下面看看代码
package com.test.theread.message;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
try {
Class clazz = Test2.class;
Object obj = clazz.newInstance();
Method method = clazz.getMethod("doRun");
method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
public void doRun() throws Exception{
Object lock = new Object();
ThreadB b = new ThreadB(lock);
b.start();
Thread.sleep(50);
ThreadA a = new ThreadA(lock);
a.start();
}
private class ThreadA extends Thread{
private Object lock;
public ThreadA(Object lock){
super();
this.lock = lock;
}
@Override
public void run() {
try {
synchronized (lock) {
for(int i=1; i<=10; i++){
MyList.add();
if(i == 5){
//唤醒在等待的线程,但是不会立马释放锁,需要等待该现场执行完后释放
lock.notify();
System.out.println("发出通知");
}
System.out.println("添加了 "+i+" 个元素");
Thread.sleep(1000);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private class ThreadB extends Thread{
private Object lock;
public ThreadB(Object lock){
super();
this.lock = lock;
}
@Override
public void run() {
try {
synchronized(lock){
if(MyList.size() != 5){
System.out.println("wait begin ---------");
//进入等待,立刻释放锁
lock.wait();
System.out.println("wait end -----------");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static class MyList{
private static List<String> list = new ArrayList<String>();
public static void add(){
list.add("hj");
}
public static int size(){
return list.size();
}
}
}