天天看点

一次搞定 生产者/消费者模式

生产者、消费者模式是日常生活中随处可见的场景。用它来解决现实生活中的业务场景很有用,自己总结一下自己理解到的。

我现在知道的有两种:

第一种:最最普通的

1、设计两个线程 一个生产者、一个消费者同时启动去操作共享的 容器

2、先在容器上加个锁,判断容器是否符合自己的使用规则,不符合规则,自己等待。(在这里生产者、和消费者肯定有一个是符合规则的。)符合规则, 操作完容器。通知等待的另一方。自己等待。等待被唤醒。

3、上面进行判断以后不符合规则的线程,被唤醒去继续判断是否符合自己的使用规则,此时肯定符合规则。开始进行操作 容器--> 唤醒另一个线程。

4、此时第2步等待的线程被唤醒,继续运行。两个线程依次交替执行。

[img]http://dl2.iteye.com/upload/attachment/0112/4997/464af191-01a5-355d-bef5-dbd5c825450b.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0112/4999/13068e7c-f866-37a4-bede-2f52d280ab64.png[/img]

第二种:使用Java中的阻塞队列,这种方法最简单因为阻塞队列自己实现了。

生产者只管往里放,如果容器满了,自己阻塞然后会一直判断此容器是否被消费。

消费者一直往出取,如果容器空了,自己阻塞然后会一直判断此容器是可以被消费的东西。

阻塞队列 有两种

BlockingQueue 接口

LinkedBlockingQueue 类

ArrayBlockingQueue 类

[b][color=red]使用take() \put() 方法可以阻塞[/color][/b]

[img]http://dl2.iteye.com/upload/attachment/0112/5009/64db517b-8c6a-3b2a-82de-328f9d63e805.png[/img]

参考资料:

http://developer.51cto.com/art/201104/256805.htm

http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html

http://www.infoq.com/cn/articles/producers-and-consumers-mode/

继续阅读