首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java线程(3)并发协作-生产者消费者模型(转载)

2012-09-11 
java线程(三)并发协作-生产者消费者模型(转载)?实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,

java线程(三)并发协作-生产者消费者模型(转载)

?实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。??? 对于此模型,应该明确一下几点:??? 1、生产者仅仅在仓储未满时候生产,仓满则停止生产。??? 2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。??? 3、当消费者发现仓储没产品可消费时候会通知生产者生产。??? 4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。??? 此模型将要结合java.lang.Object的wait与notify、notifyAll方法来实现以上的需求。这是非常重要的。
运行结果:已经生产了10个产品,现仓储量为40 已经生产了10个产品,现仓储量为50 已经消费了50个产品,现仓储量为0 已经生产了80个产品,现仓储量为80 已经消费了30个产品,现仓储量为50 已经生产了10个产品,现仓储量为60 已经消费了20个产品,现仓储量为40 已经生产了10个产品,现仓储量为50 已经生产了10个产品,现仓储量为60 已经生产了10个产品,现仓储量为70 
?说明:??? 对于本例,要说明的是当发现不能满足生产或者消费条件的时候,调用对象的wait方法,wait方法的作用是释放当前线程的所获得的锁,并调用对象的notifyAll() 方法,通知(唤醒)该对象上其他等待线程,使得其继续执行。这样,整个生产者、消费者线程得以正确的协作执行。notifyAll() 方法,起到的是一个通知作用,不释放锁,也不获取锁。只是告诉该对象上等待的线程“可以竞争执行了,都醒来去执行吧”。本文转载自:http://lavasoft.blog.51cto.com/62575/222742博主个人加注:notifyAll和notify的不同之处:notifyAll是唤醒同步监视器上等待的所有线程只有当前线程放弃对同步监视器的锁定之后,才可以执行被唤醒的线程。而notify是唤醒同步监视器上的任意一个等待线程。但是notify容易产生死锁,所以大部分情况下,都是采用notifyAll方法,可以看到上面的程序都是采用notifyAll。

热点排行