在调用wait的时候,线程会释放其占用的对象锁,例子如下:
public class Demo implements Runnable {
private static final Logger logger = Logger.getLogger(Demo.class);
public void run() {
logger.info("我开始运行了");
synchronized (this) {
logger.info("我进来了");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
logger.info("我要等待");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.info("我要结束了");
}
}
public static void main(String[] args) throws IOException {
Demo demo = new Demo();
new Thread(demo).start();
new Thread(demo).start();
new Thread(demo).start();
}
}
如果不注释wait(),三个线程都会进入等待状态,且都停留在wait()处:
[Thread-0] 我开始运行了
[Thread-1] 我开始运行了
[Thread-2] 我开始运行了
[Thread-0] 我进来了
[Thread-0] 我要等待
[Thread-2] 我进来了
[Thread-2] 我要等待
[Thread-1] 我进来了
[Thread-1] 我要等待
如果注释wait(),三个线程会按顺序完成整个流程(因为对当前对象加了锁)
[Thread-0] 我开始运行了
[Thread-2] 我开始运行了
[Thread-1] 我开始运行了
[Thread-0] 我进来了
[Thread-0] 我要等待
[Thread-0] 我要结束了
[Thread-1] 我进来了
[Thread-1] 我要等待
[Thread-1] 我要结束了
[Thread-2] 我进来了
[Thread-2] 我要等待
[Thread-2] 我要结束了
其它更详细的介绍见:http://www.360doc.com/content/10/1219/21/573136_79591569.shtml