1、上述方法在Java.Lang.Object类中,因此,它们可以再任何类中的任何对象中调用。当其中的一个方法调用时,调用它的线程会释放在此对象上的锁
2、在对象上调用上述方法前,必须获得该对象的锁
3、线程可以等待(wait)一个它锁定的对象,在等待时,它会释放此对象的锁并暂停,知道收到其他线程通知
4、调用wait方法,在以下情况发生前保持休眠:
一、时间到期
二、线程被中断
其他线程调用该线程的interrupt()方法,设置中断标志位为true;wait方法轮询该中断标志,为true是抛出interruptedException并设置中断标志位为false
三、对象得到通知
5、调用notify函数:
一、差不多随机在等待此对象的线程列表中选择一个,并唤醒该线程。
二、一旦线程得到通知,它会试图重新获得所等待对象的锁。成功,就继续执行wait调用后的语句;失败,它就会阻塞于此对象,直到得到锁,然后接着执行wait调用后语句!
6、调用notifyall函数
一、唤醒所有等待此对象的线程
二、这些线程都会尝试获得所等待对象的锁,但只有一个能得到,其余线程都会阻塞!
7、一个简单的例子
线程2:
public class SecondThread extends Thread{
private List<String> mData = null;
public SecondThread(List<String> pData){
mData = pData;
}
public void printData(){
//获得锁
synchronized(mData){
int _size = mData.size();
while(_size == 0){
try{
mData.wait();
//唤醒后执行的操作
ListIterator<String> _iterator = mData.listIterator();
while(_iterator.hasNext())
{
System.out.println(_iterator.next());
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
@Override
public void run() {
printData();
}
}
主线程:
public class MainThread {
private static List<String> mData;
public static void main(String[] argv){
mData = new ArrayList<String>();
new SecondThread(mData).start();
try {
Thread.sleep(5);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
synchronized(mData){
try{
for(int i=0;i<10;i++){
mData.add(String.valueOf(i));
}
//通知存放了数据
mData.notify();
}catch(Exception e){
e.printStackTrace();
}
}
}
}