这三个方法依赖于同一个锁对象,,也就是说只能采用同一个锁的对象的notify唤醒该锁wait造成的挂起。注意在调用notify和wait方法的时候,首先得获取该锁的使用权限。
wait 方法将线程阻塞。如果有十个线程调用了某个锁对象的wait方法,则10个线程都挂起。如果将这十个线程都唤醒,则需要调用10次该锁对象的notify方法,或者调用一次该锁对象notifyAll方法。
notify 唤醒单个线程。
notifyAll 唤醒所有的线程。
例子如下:雇主有5个工人。当雇主干活命令的使用,则工人工作。如不发送干活命令则工人等待。
说明: 雇主(employer)有个锁对象(command),雇主雇佣了5个工人(eployee)。
工人的工作(run方法)使用了雇主的锁对象(command)来挂起。
当雇主对所对象command唤醒(调用notify方法)则工人继续工作。
public class Employee implements Runnable
{
String command;
Employee(String command)
{
this.command =
command;
}
@Override
public void run()
{
synchronized(command )
{
System. out.println("I
am waiting by invoking command.wait() method");
try {
command.wait();
System. out.println("Employer
notify me by invoking command.notify() method, then I will do my work");
} catch (InterruptedException
e) {
// TODO Auto-generated
catch block
e.printStackTrace();
}
System. out.println("I
am working" );
}
}
}
public class Employer
{
//雇主的锁对象,使用该command.notify方法来要工人干活
String command = "command";
public static void main(String[]
sss) throws InterruptedException
{
Employee mployee1 = new Employee(command);
Employee mployee2 = new Employee(command);
Employee mployee3 = new Employee(command);
Employee mployee4 = new Employee(command);
Employee mployee5 = new Employee(command);
Thread t1 = new Thread(mployee1);
Thread t2 = new Thread(mployee2);
Thread t3 = new Thread(mployee3);
Thread t4 = new Thread(mployee4);
Thread t5 = new Thread(mployee5);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
Thread. sleep(1000);
//注意需要得到对应锁对象的使用权限
synchronized(command)
{
//此次调用了两次notify则会有两个工人工作, 如果调用notifyAll则所有的线程都唤醒,所有的工人都干活
command.notify();
command.notify();
}
}
}