每调用一次notify()方法,只通知一个线程进行唤醒,唤醒的顺序与执行wait()方法的顺序一致。
类MyService.java代码
package chapter3.test3_1.test3_1_13;
public class MyService {
private Object lock = new Object();
public void waitMethod() {
try {
synchronized (lock) {
System.out.println("begin wait " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
lock.wait();
System.out.println(" end wait " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void notifyMethod() {
synchronized (lock) {
System.out.println("begin notify " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
lock.notify();
System.out.println(" end notify " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
}
}
}
执行wait()方法的线程MyThreadA.java源代码
package chapter3.test3_1.test3_1_13;
public class MyThreadA extends Thread {
private MyService service;
public MyThreadA(MyService service) {
super();
this.service = service;
}
@Override
public void run() {
service.waitMethod();
}
}
创建唤醒线程MyThreadB.java
package chapter3.test3_1.test3_1_13;
public class MyThreadB extends Thread {
private MyService service;
public MyThreadB(MyService service) {
super();
this.service = service;
}
@Override
public void run() {
service.notifyMethod();
}
}
运行类Test.java代码
package chapter3.test3_1.test3_1_13;
public class Test {
public static void main(String[] args) throws InterruptedException {
MyService service = new MyService();
for (int i = 0; i < 10; i++) {
MyThreadA t1 = new MyThreadA(service);
t1.start();
}
Thread.sleep(1000);
MyThreadB t1 = new MyThreadB(service);
t1.start();
Thread.sleep(500);
MyThreadB t2 = new MyThreadB(service);
t2.start();
Thread.sleep(500);
MyThreadB t3 = new MyThreadB(service);
t3.start();
Thread.sleep(500);
MyThreadB t4 = new MyThreadB(service);
t4.start();
Thread.sleep(500);
MyThreadB t5 = new MyThreadB(service);
t5.start(); // 一共唤醒5个线程
}
}
程序运行结果如图
notify()
方法仅按照执行
wait()方法的顺序依次唤醒一个线程,分别是Thread-0
、
Thread-5
、
Thread-4
、
Thread-3
、
Thread-2。