线程中的wait,notify
2015-04-23 17:00
113 查看
在调用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
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
相关文章推荐
- 线程问题3(synchronized,wait,notify,notifyAll,类锁,对象锁)
- 线程wait和notify方法的demo详解
- java线程同步——synchronized (wait、notify)
- 线程间协作的两种方式:wait、notify、notifyAll和Condition
- 线程进届wait notify 锁
- java线程同步原理及wait,notify的用法及与sleep的区别
- Java线程_wait,sleep,notify,notifyall,join
- java多线程学习之线程通信-wait()等待 notify()唤醒
- 线程间通信 wait() notify()
- Java【多线程知识总结(10)】线程通信之wait()与notify()的运用--模拟指挥官指挥2个连队交替轰炸战区
- Java【多线程知识总结(10)】线程通信之wait()与notify()的运用--模拟指挥官指挥2个连队交替轰炸战区<另外的写法>
- JAVA线程 -- wait notify notifyAll
- wait和notify实现的生产者消费者线程交互
- JAVA线程间协作:wait.notify.notifyAll
- java 线程 以及wait()和notify()
- Java:使用wait()与notify()实现线程间协作
- 【解惑】 正确理解线程等待和释放(wait/notify)
- 深入线程的wait()/notify()
- java并发编程-线程间协作的两种方式:wait、notify、nitifyAll和Condition
- java并发编程(十三)--线程间协作:wait、notify、notifyAll