目录
一、线程间的通信
1、线程间的通信方式(四种)
- 同步(多个线程通过synchronized关键字这种方式来实现线程间的通信)
- while轮询的方式
-
wait/notify机制
-
管道通信
2、生产者 ---消费者
1.在这四种通信方式中,我着重讲解一下wait/notify机制,要想了解他们之间的关系那就不得不提到Monitor 监视器这个概念了。
Monitor 监视器
Java当中的每个对象都有一个监视器 用于监视并发代码的重入,在非多线程的情况下这个监视器不发挥作用,反之如果在synchronized 的范围内,监视器发挥作用的。
Wait和notify 方法必须存在于synchronized的块中 这三个关键字针对的是同一个监视器,wait之后,其他线程是可以进入同步块执行的
当代码并不持有监视器的使用权时,(脱离同步块)如果去调用wait或者notify会抛出异常illegaMonitorStateException 也包括在synchronized块中取调用另一个对象的wait或者notify因为对象的不同也会抛出异常。
Synchronized 单独使用 相当于在synchronized块中的方法获取了lock实例的monitor 把Wait和notify、以及notifyAll的用法 synchronized联合性的使用 能够实现所谓的生产者和消费者。
2.为了更好的了解,接下来为大家用java实现生产者和消费者的代码
//仓库
public class Storage {
//仓库数量
private int size=0;
//生产函数
public synchronized void produce(){
if (size < 10) {
size++;
System.out.println( "生产者:开始生产,内存还有" + size + "个");
notifyAll(); // 唤醒消费者线程
} else {
try {
wait(); // 让生产者线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//消费函数
public synchronized void buy(){
if (size > 0) {