线程通信的理解
package com.tongxin.bean;
/*
* 使用两个线程交替打印 1~100
*
* 涉及的方法:
* ①wait():是当前线程进入阻塞状态,并释放同步监视器
* ②notify():唤醒被wait()阻塞的一个线程,如果有多个线程被
* 阻塞,则先唤醒优先级高的线程
* ③notifyAll():一旦执行此方法,就会唤醒所有被wait()阻塞的线程
*
* 注意:
* ①三个方法必须声明在同步代码块或者同步方法中(即在lock中不可使用这三种方法)
* ②如果是this作为同步监视器,则可以省略this. 如果是其它的,比如 Object的obj
* 则不可省略
* */
public class Communicate {
public static void main(String[] args) {
Test t = new Test();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.setName("线程一");
t2.setName("线程二");
t1.start();
t2.start();
}
}
class Test implements Runnable{
private int i=1;
public void run(){
while(true){
synchronized(this){
// 线程一被阻塞后,线程二进来,运行notify()方法,
// 把线程一唤醒,而后线程二被阻塞,之后被线程一唤醒
// 如此,便最终执行结束
// 注意:即使线程一醒过来,也无法立即执行,因为此时线程二
// "拿着"同步监视器,直到执行了wait(),才会释放
// 同步监视器,此时线程一才能进来
notify(); //忽略了this.
if(i<=100){
System.out.println(Thread.currentThread().getName()+" : "+i);
i++;
// 可解释为:线程一到这里被阻塞(打印1)
// 而后线程二到这里也阻塞(打印2)
// 两线程都阻塞,所以程序停止运行
// 要用一个方法来恢复它们的运行状态
try {
wait(); //忽略了this.
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
}