一个线程在同步块或者同步方法中使用同步对象调用 wait() 方法的时候,wait()会暂时停止目前进程的执行,直到有信号来到或子进程结 束。如果在调用wait()时子进程已经结束,则wait()会立即返 回子进程结束状态值。
当线程B访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程A拿到了,这个时候,线程B只能被挂起,等待线程A释放锁。
但是拿到锁的线程A在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程A自己想主动等待的),希望等到某个条件满足后,继续执行任务。在同步代码块里,线程A必须先释放锁,线程B才有资格获取锁,进入同步代码块,执行代码。等线程B执行完后,线程A需要的条件已经满足,那么这个时候必须有一个通知机制,让线程A从等待状态变成执行状态,继续执行代码。
public class test {
public static void main(String[] a){
Object object=new Object();
Thread thread=new Thread(){
@Override
public void run() {
synchronized (object){
System.out.println("thrad star");
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("thrad end");
}
};
Thread thread1=new Thread(){
@Override
public void run() {
synchronized (object){
System.out.println("thrad1 star");
}
System.out.println("thrad1 end");
}
};
Thread thread2=new Thread(){
@Override
public void run() {
synchronized (object){
System.out.println("thrad2 star");
object.notify();
}
System.out.println("thrad2 end");
}
};
Thread thread3=new Thread(){
@Override
public void run() {
synchronized (object){
System.out.println("thrad3 start");
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
object.notify();
System.out.println("thrad3 end");
}
}
};
thread.start();
thread1.start();
thread2.start();
thread3.start();
}
}