1.假设仓库只能存一件产品,生产者将产品放入仓库,消费者将产品从仓库取出
2.仓库没有产品,生产者将产品放仓库,否则停止生产并等待,直到仓库产品被消费者取走
3.如果仓库放有产品,消费者可取走,否则停止消费并等待,直到仓库再次放入产品
===============
线程通信-分析
生产者没有生产产品之前,要通知消费者等待,生产产品之后,通知消费者消费
消费者消费后通知生产者已经结束消费,需要生产新产品供消费
生产者和消费者问题中,仅有synchronized是不够的
synchronized可组止并发更新同一个共享资源,实现同步
synchronized不能实现线程之间消息传递(通信)
=================
线程通信方法
wait():线程一直等待,直到其他线程通知,与sleep不同,会释放锁
wait(long timeout):指定等待的毫秒数
notify():唤醒处于等待状态的线程
notifyAll():唤醒所有调用wait()方法的线程,优先级别高的线程优先调度
都是Object类方法,都只能在同步方法或同步代码块中使用,否则抛出IIIegaIMonitorStateException
============
解决方式一:
管程法
生产者:负责生产数据的模块(可能是方法,对象,线程,进程);
消费者:负责处理数据的模块(可能是方法,对象,线程,进程);
缓冲区:消费者不能直接使用生产者的数据,他们之间有缓冲区,生产者将数据放入缓冲区,消费者从缓冲区拿数据
解决方式二:
并发协作模型,信号灯法