java多线程-生产者与消费者模型(有限缓冲问题)


1.预备知识点

线程同步
同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。“同”字从字面上容易理解为一起动作其实不是,“同”字应是指协同、协助、互相配合;。在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性
是什么:什么是生产者消费者模型?
生产者消费者问题,也称有限缓冲问题 (一个多线程同步问题的经典案例)

2.问题描述

将“生产者和消费者”模型用多线程机制实现。分别创建消费者类、生产者类、堆栈类,其中消费者类和生产者类分别实现线程接口。
问题解析;
1、生产者与消费者不能同时进行工作,形成的是互斥关系;
2、生产者与生产者之间不能同时生产,处于互斥关系;
3、消费者与消费者之间不能同时工作,处于互斥关系;
4、当缓冲区之内的资源满时,生产者不能生产;
5、当缓冲区之内的资源空时,消费者不能消费;
6、消费者消费的速度不能超过生产者;

3.java实现方式的预备知识


wait() 与 notify/notifyAll 方法必须在同步代码块中使用
wait() 与 notify/notifyAll() 是Object类的方法,在执行两个方法时,要先获得锁。那么怎么获得锁呢?
在这篇:JAVA多线程之Synchronized关键字–对象锁的特点文章中介绍了使用synchronized关键字获得锁。因此,wait() 与 notify/notifyAll() 经常与synchronized搭配使用,即在synchronized修饰的同步代码块或方法里面调用wait() 与 notify/notifyAll()方法。
notify()唤醒任意一个wait()的线程;
notifyAll()唤醒所有的wait()的线程处于就绪状态;------(唤醒等待线程并不等于让出当前的线程,线程依旧锁定知道当前线程完成);
方法辨析:Thread.sleep()线程睡眠;
1、线程睡眠是帮助所有线程获得运行机会的最好方法。
ps: sleep(0)让当前线程回到可运行状态参与线程的优先级竞争
2、线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。--------注意这里的sleep()与线程锁没有关系; sleep()并不释放锁;

一种特殊的情况:在线程持有对象锁时,使用sleep()睡眠当前线程,并不会释放当前锁,所以随眠结束后,线程恢复原有运行转态,仍然是同步当前线程的

3、sleep()是静态方法,只能控制当前正在运行的线程。
另附:多线程问题:

Object类中与线程有关的方法:

1)notify/notifyAll

2)wait()/wait(long)

java.lang.Thread中与之相关的方法:

1)interrupt()

2)sleep()/sleep(long)

3)join()/suspend()/resume()....

4.实现

https://pan.baidu.com/s/1Sk4-QYf5zTxz1G2ywgKigQ

猜你喜欢

转载自blog.csdn.net/qq_35495763/article/details/80787851
今日推荐