一、概述
- 所谓线程通信就是线程间相互发送数据,线程间共享一个资源即可实现线程通信。
- 形式:通过共享一个数据的方式实现,根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。
- 实际应用场景:
- 生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费生产者产生的数据
- 要求:生产者生产完数据后唤醒消费者,然后等待自己,消费者消费完该数据后唤醒生产者,然后等待自己。
二、案例
方法为什么要用同步锁对象调用(虽然可以用任意对象调用):因为只有同步锁对象才知道是谁需要等待,需要唤醒谁。 否则会出现莫名其妙的BUG。
/**
目标:模拟线程通信,来电提醒线程 接电话线程(了解思想即可,代码不重要)
*/
public class Phone {
//实现线程通信:默认手机当前处于等待来电提醒
private boolean flag=false;
public void run(){
//a.负责来电提醒线程
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true){
synchronized (Phone.this){//匿名内部类调用外部对象作为锁对象
if(flag){
}else {
//代表有来电提醒了
System.out.println("您好,有新电话呼入,请接听(来电显示1秒)~~~");
Thread.sleep(1000);
flag=true;
Phone.this.notify();
Phone.this.wait();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true){
synchronized (Phone.this){
if(flag){
//可以接电话了
System.out.println("电话接听中,通话5秒结束~~~");
Thread.sleep(5000);
flag=false;//通话结束将手机状态改为等待呼入状态
Phone.this.notify();
Phone.this.wait();
}else {
Phone.this.notify();
Phone.this.wait();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public static void main(String[] args) {
Phone iphone=new Phone();
iphone.run();
}
}