1,什么时候需要通信
-
多个线程并发执行时, 在默认情况下CPU是随机切换线程的
-
如果我们希望他们有规律的执行, 就可以使用通信, 例如每个线程执行一次打印
2,怎么通信
-
如果希望线程等待, 就调用wait()
-
如果希望唤醒等待的线程, 就调用notify();
-
这两个方法必须在同步代码中执行, 并且使用同步锁对象来调用
3,案例
public class Demo1_Notify {
/**
* @param args
* 等待唤醒机制
*/
public static void main(String[] args) {
final Printer p = new Printer();
new Thread() {
public void run() {
while(true) {
try {
p.print1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
public void run() {
while(true) {
try {
p.print2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
//等待唤醒机制
class Printer {
private int flag = 1;
public void print1() throws InterruptedException {
synchronized(this) {
if(flag != 1) {
this.wait(); //当前线程等待
}
System.out.print("我");
System.out.print("是");
System.out.print("小");
System.out.print("帅");
System.out.print("呀");
System.out.print("\r\n");
flag = 2;
this.notify(); //随机唤醒单个等待的线程
}
}
public void print2() throws InterruptedException {
synchronized(this) {
if(flag != 2) {
this.wait();
}
System.out.print("你");
System.out.print("开");
System.out.print("心");
System.out.print("吗");
System.out.print("\r\n");
flag = 1;
this.notify();
}
}
}