●所谓线程通信就是线程间相互发送数据,线程间共享一个资源即可实现线程通信。
●通过共享一个数据的方式实现。
●根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。
●生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费生产者产生的数据。
●要求:生产者线程生产完数据后唤醒消费者,然后等待自己,消费者消费完该数据后唤醒生产者,然后等待自己。
方法名称 | 说明 |
---|---|
void wait() | 当前线程等待,直到另一个线程调用notify() 或 notifyAll()唤醒自己 |
void notify() | 唤醒正在等待对象监视器(锁对象)的单个线程 |
void notifyAll() | 唤醒正在等待对象监视器(锁对象)的所有线程 |
注意
●上述方法应该使用当前同步锁对象进行调用。
●模拟客服系统,系统可以不断的接入电话和分发给客服
●线程通信的前提:线程通信通常是在多个线程操作同一个共享资源的时候需要进行通信,且要保证线程安全。
/**
目标:模拟线程通信,来电提醒,线程接电话线程了解思想即可,代码并不重要)
*/
public class Phone {
//实现线程间通信: 默认认为手机当前处于等待来电提醒
private boolean flag = false;
public void run(){
//a.负责来电提醒的线程
new Thread(new Runnable() {
@Override
public void run() {
//把手机对象作为锁 Phone.this
try {
while (true) {
synchronized (Phone.this){
if (!flag){
//代表需要来电提醒
System.out.println("您好,有电话呼入,请接听!");
flag = true;
//唤醒别人,等待自己
Phone.this.notify();
Phone.this.wait();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
//b.接电话线程,正式接听
new Thread(new Runnable() {
@Override
public void run() {
try {
//不断地接听电话
while (true){
//把手机对象作为锁 Phone.this
synchronized (Phone.this){
if (flag){
//可以接听电话
System.out.println("电话接听中~通话五分钟后结束啦!");
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) {
///1.创建一个手机对象
Phone huawei = new Phone();
huawei.run();//开机啦
}
}