多线程part7-等待唤醒机制
一个多线程协作模式
消费者
先判断中间类是否有消费品
没有则等待,有则消费
消费之后唤醒生产者
生产者
判断中间类是否有消费品
有则等待,没有则生产
消费品放在中间类
唤醒消费者
常用方法:
需要用锁对象去调用
void wait() 让当前线程等待,知道被其他线程唤醒
让当前线程跟锁绑定
void notify() 随机唤醒单个线程
void notifyAll() 唤醒所有线程
阻塞队列实现
中间类相当于一个管道
阻塞情况:
生产者放数据进管道,如果管道满了,放不进去,会等待
消费者取数据,管道空,取不到会等待
阻塞队列的继承结构
四个接口
Iterable
Collection
Queue
BlockingQueue
Iterable使得可以利用迭代器或增强for来进行遍历
Collection接口说明塞队列是单列集合
Queue说明是队列
BlockingQueue说明是阻塞队列
两个实现类对象
ArrayBlockingQueue 底层由数组实现,有长度的界限,创建时必须指定长度
LinedBlockingQueue 底层是链表,无长度的界限,但不是真正的无界,最大值是int的最大值
细节:
生产者和消费者必须使用同一个阻塞队列
阻塞队列的两个方法
put()和take()都自带了锁,所以不需要自己写锁,否则可能会导致死锁