首页 > 编程语言 > 详细

Java实现生产者消费者

时间:2017-04-05 00:07:43      阅读:255      评论:0      收藏:0      [点我收藏+]

方法1:最简单--利用LinkedBlockingQueue

队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构。 
1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点。 ——put()方法
2.从队列头部取一个对象,如果没有对象,就等待直到有对象可取。 ——take()方法
3.在存取队列的过程中,锁定队列对象,不允许其它线程访问队列。——使得它是线程安全的

下面的代码适用于多个生产者、多个消费者。

技术分享 Pruducer.java

技术分享 Consumer.java

技术分享 Main.java

 

方法2:不采用BlockingQueue,利用lock、Condition来实现

思路:

利用可重用的LinkedList来存放资源,生产者addLast(),消费者removeFirst()。

使用ReentrantLock()来实现消费者和生产者的同步;//可重用的互斥锁

思考:为什么使用了lock后,还使用了它的2个newCondition,这样做有什么好处?

技术分享 ProducerConsumer .java

 

关于Java线程的lock、condition、synchronized的小小总结:

1.synchronized简单易用,但是功能受局限,无法满足复杂的同步机制,比如“读者写者问题”:多个读者线程是不互斥的。

2.lock以更优雅的方式来解决线程同步,比如读写锁ReadWriteLock。

3.Condition解决线程间通信,为不同的线程建立不同的条件。

推荐博文:Java线程-锁机制

Condition可以替代传统的线程间通信,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll()。

     ——为什么方法名不直接叫wait()/notify()/nofityAll()?因为Object的这几个方法是final的,不可重写!

Condition实现了BlockingQueue的功能。

看看BlockingQueue的继承和实现。

技术分享

一般的锁Lock的实现:注意ReadLock、WriteLock是内部的静态类,只有ReentrantReadWriteLock类可以调用。

技术分享

读写的锁ReadWriteLock

技术分享

思考:OS的信号量是什么,线程通信的方式有哪些?共享变量和消息传递。

        信号量与互斥锁有什么联系?


Java实现生产者消费者

原文:http://zhangtaoze.blog.51cto.com/12776936/1912829

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!