真正理解java wait notify
2016-03-21 17:48
302 查看
从字面上理解,
notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。
nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,这一点与notify()方法是不同的。虽然会唤醒所有的进程,但是同时也只会有一个运行,因为只有一个进程可以获得锁。
notify()的意思在于,如果此时有三个进程wait在一个锁上,notify只会唤醒一个,其他的二个会继续等待notify信号,即使这个锁是空闲的,也不能执行下去。notifyAll()就会唤醒全部的等待在这个锁上的进程,一旦这个锁空闲,就会立即执行。也就是这三个进程会按某种顺序执行完毕。
可以把下面例子中的notify和notifyAll的注释替换一遍。看看结果
package com.me.test;
/**
* Created by Administrator on 2016/3/21.
*/
public class WaitNotifyTest {
private static Object object = new Object();
public static void main(String[] args){
Thread1 thr0 = new Thread1();
Thread1 thr1 = new Thread1();
Thread2 thr2 = new Thread2();
thr0.setName("wait1");
thr1.setName("wait2");
thr2.setName("notify");
thr0.start();
thr1.start();
thr2.start();
}
static class Thread1 extends Thread{
@Override
public void run(){
synchronized (object){
try {
System.out.println(Thread.currentThread().getName()+"得到锁");
object.wait();
System.out.println(Thread.currentThread().getName()+"执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Thread2 extends Thread{
@Override
public void run(){
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object){
System.out.println(Thread.currentThread().getName()+"执行");
//object.notify();
object.notifyAll();
System.out.println(Thread.currentThread().getName()+"释放锁");
}
}
}
}
notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。
nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,这一点与notify()方法是不同的。虽然会唤醒所有的进程,但是同时也只会有一个运行,因为只有一个进程可以获得锁。
notify()的意思在于,如果此时有三个进程wait在一个锁上,notify只会唤醒一个,其他的二个会继续等待notify信号,即使这个锁是空闲的,也不能执行下去。notifyAll()就会唤醒全部的等待在这个锁上的进程,一旦这个锁空闲,就会立即执行。也就是这三个进程会按某种顺序执行完毕。
可以把下面例子中的notify和notifyAll的注释替换一遍。看看结果
package com.me.test;
/**
* Created by Administrator on 2016/3/21.
*/
public class WaitNotifyTest {
private static Object object = new Object();
public static void main(String[] args){
Thread1 thr0 = new Thread1();
Thread1 thr1 = new Thread1();
Thread2 thr2 = new Thread2();
thr0.setName("wait1");
thr1.setName("wait2");
thr2.setName("notify");
thr0.start();
thr1.start();
thr2.start();
}
static class Thread1 extends Thread{
@Override
public void run(){
synchronized (object){
try {
System.out.println(Thread.currentThread().getName()+"得到锁");
object.wait();
System.out.println(Thread.currentThread().getName()+"执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Thread2 extends Thread{
@Override
public void run(){
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object){
System.out.println(Thread.currentThread().getName()+"执行");
//object.notify();
object.notifyAll();
System.out.println(Thread.currentThread().getName()+"释放锁");
}
}
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序