Java实现生产者消费者
2014-03-17 22:33
218 查看
方法1:最简单--利用LinkedBlockingQueue
队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构。
1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点。 ——put()方法
2.从队列头部取一个对象,如果没有对象,就等待直到有对象可取。 ——take()方法
3.在存取队列的过程中,锁定队列对象,不允许其它线程访问队列。——使得它是线程安全的
下面的代码适用于多个生产者、多个消费者。
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的信号量是什么,线程通信的方式有哪些?共享变量和消息传递。
信号量与互斥锁有什么联系?
参考资料
By BYRHuangQiang 2014-03-18 09:05:30
队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构。
1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点。 ——put()方法
2.从队列头部取一个对象,如果没有对象,就等待直到有对象可取。 ——take()方法
3.在存取队列的过程中,锁定队列对象,不允许其它线程访问队列。——使得它是线程安全的
下面的代码适用于多个生产者、多个消费者。
import java.util.*; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ProducerConsumer { private static final LinkedList<Integer> buffer = new LinkedList<Integer>(); private static final int BUFFERSIZE = 10; private static Lock lock = new ReentrantLock();//可重用的互斥锁 private static Condition NotFull = lock.newCondition(); private static Condition NotEmpty = lock.newCondition(); static class Producer extends Thread { public void run() { while (true) { // lock lock.lock(); if (buffer.size() == BUFFERSIZE) { System.out.println("BUffer is fulls"); try { NotFull.await(); } catch (InterruptedException e) { e.printStackTrace(); } } else { buffer.addLast(1); NotEmpty.signal(); } lock.unlock(); // unlock } } } static class Consumer extends Thread { public void run() { while (true) { // lock lock.lock(); if (buffer.size() == 0) { System.out.println("BUffer is empty"); try { NotEmpty.await(); } catch (InterruptedException e) { e.printStackTrace(); } } else { buffer.removeFirst(); NotFull.signal(); } // unlock lock.unlock(); } } } public static void main(String[] args){ new Consumer().start(); new Producer().start(); } }
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的信号量是什么,线程通信的方式有哪些?共享变量和消息传递。
信号量与互斥锁有什么联系?
参考资料
By BYRHuangQiang 2014-03-18 09:05:30
相关文章推荐
- 生产者/消费者问题的多种Java实现方式--转
- 生产者-消费者问题【Java实现】
- 生产者消费者问题之Java线程实现
- 生产者/消费者问题的多种Java实现方式
- Java 线程同步问题 生产者-消费者 算法实现 -Java学习笔记(29)
- [转载] Java实现生产者消费者问题
- java多线程,这样的生产者消费者实现会有什么问题呢?
- java 多线程,生产者消费者实现。适合多个生产者消费者线程;打印线程编号便于查看正确性
- 生产者/消费者问题的多种Java实现方式
- java实现生产者消费者问题
- Java实现生产者与消费者(三)(多生产者多消费者)
- 生产者/消费者问题的多种Java实现方式
- Java多线程 - 实现生产者与消费者模式
- Java阻塞队列BlockingQueue实现生产者消费者-只有代码-不讲原理
- Java Note: 多线程的同步(互斥锁)的方法对比,信号量锁,读写锁的实现,生产者-消费者模式的实现
- Java实现生产者消费者的学习实例
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- java多线程之多生产者与多消费者案例之Lock和Condition实现方式
- Java语言synchronized与lock实现生产者消费者
- 生产者/消费者问题的多种Java实现方式