例子:两个线程交替输出数字
class Number implements Runnable {
private int number = 1;
@Override
public void run() {
while (true) {
synchronized (this) {
notify();
if (number <= 100) {
System.out.println(Thread.currentThread().getName() + "输出:" + number);
number++;
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
}
public class CommunicationTest {
public static void main(String[] args) {
Number number = new Number();
Thread t1 = new Thread(number);
Thread t2 = new Thread(number);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
结果:
线程1输出:1
线程2输出:2
线程1输出:3
线程2输出:4
线程1输出:5
线程2输出:6
线程1输出:7
说明:
- wait() 方法,会使线程进入阻塞,并释放锁 (同步监视器)
- notify() 方法,会唤醒调用过wait方法的线程,使之重新参入下一轮的cpu竞争中去。如果有多个线程被wait,就唤醒优先级高的那个线程
- notifyAll() 方法,会唤醒所有调用过wait方法的线程
注意:
- wait()、notify()、notifyAll() 这三个方法必须使用在同步代码块或同步方法中。
- wait()、notify()、notifyAll() 这三个方法的调用者必须是同步代码块或同步方法中的同步监视器,否则会出现 异常。
- wait()、notify()、notifyAll() 这三个方法都是定义在 java.lang.Object类中的。