浅谈java线程的notify()跟wait()

浅谈java线程的notify()和wait()
   最近在重新看操作系统进程控制方面的知识,在看了进程的阻塞与唤醒知识的时候,里面有句话:“应当指出,block原语和wakeup原语是一对作用刚好相反的原语。故在某进程中调用了阻塞原语,则必须在与之相合作的另一进程中或其他相关的进程中安排唤醒原语,以能唤醒阻塞进程;否则,其将长久地处于阻塞状态,从而再无机会继续运行”。 然后联想到了JAVA线程中的notify()和wait()方法,其实是*父类Object的两个方法,初学JAVA的时候这两个方法老是不太会用,现在重新写了个例子算是加深了对它们的理解。
代码如下:
public class ThreadBlockAndNotify {
static Thread t1 = new Thread(new Runnable() {

@Override
public void run() {
System.out.println("开始下载图片");
try {
for(int i = 1 ;i <= 10;i++){
Thread.sleep(1000);
System.out.println("图片已下载完成" + i * 10 +"%");
}

} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("图片下载完成");
synchronized(t2){
t2.notify();             //marked
}


}
});
static Thread t2 = new Thread(){
@Override
public void run(){
synchronized(this){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
for(int i = 1 ;i <= 4;i++){
Thread.sleep(1000);
System.out.println("图片已显示完成" + i * 25 +"%");
}

} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("图片显示完成");
synchronized(t3){
t3.notify();
}

}
};
static Thread t3 = new Thread(){
@Override
public void run(){
synchronized(this){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("开始编辑图片");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("图片编辑完成");

}
};
public static void main(String[] args) {

t1.start();
t2.start();
t3.start();
}

}
       下载图片-显示图片-编辑图片  可以模拟为三个进程,当然java这里是线程。他们并发执行,但是图片的编辑必须得图片显示完成,图片要显示必须先得“有”,就要下载,所以三个线程其实是同步的。
        那么这里就要使用notify()和wait()这两个方法了,wait()方法的使用可以实现在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。当前线程必须拥有此对象监视器。注意前面这句话,所以我使用了synchronized关键字获得了该对象监视器,这样就保证了阻塞状态的线程不会被访问,一直阻塞。notify()方法的使用可以实现唤醒在此对象监视器上等待的单个线程。但是比如下载图片完成后要执行显示图片时候,我必须获得下载图片线程的监视器,用synchronized(target)获得目标监视器,并且target.notify()来唤醒该线程继续执行。
        大家可以想想如果我把//marked的那一行notify()改为notifyAll()后,程序运行会怎样?大家试试肯定能够更能理解其中的原理了。

------解决方案--------------------
先mark,有时间了再来研究下
------解决方案--------------------
感谢分享~~
------解决方案--------------------
发代码能不能用代码框啊。。这样看着头大。。
------解决方案--------------------
引用:
发代码能不能用代码框啊。。这样看着头大。。

一千两百万个赞
------解决方案--------------------
用不用代码框是态度问题。
------解决方案--------------------
总结不错,谢谢