NumberRunnableImpl
package com.wait;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
class NumberRunnableImpl implements Runnable {
private int number = 1;
private Object lock = new Object();
@Override
public void run() {
while (true) {
synchronized (lock) {
// 调用notify()唤醒阻塞的线程
lock.notify();
if (number <= 10) {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + "打印数字" + number);
number++;
try {
// 调用wait()进入阻塞状态并且释放锁
lock.wait();
// 线程唤醒后继续执行以下代码
threadName = Thread.currentThread().getName();
System.out.println(threadName + "完成本次打印");
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
}
Test
package com.wait;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
public class Test {
public static void main(String[] args) {
NumberRunnableImpl numberRunnableImpl = new NumberRunnableImpl();
Thread thread1 = new Thread(numberRunnableImpl);
thread1.setName("线程1");
Thread thread2 = new Thread(numberRunnableImpl);
thread2.setName("线程2");
thread1.start();
thread2.start();
}
}
运行结果
小结
1、调用wait()进入阻塞状态并且释放锁
2、调用notify()唤醒阻塞的线程
3、流程与理解:线程1打印数字后执行lock.wait()方法线程1进入阻塞状态并释放锁;线程2进入run方法后调用notify()唤醒阻塞的线程1,线程1继续执行直至完成;当线程2打印数字后执行lock.wait()方法线程2进入阻塞状态并释放锁...依次类推
4、锁、锁.wait()、锁.nofity()这三处必须是同一个锁(监视器)