Java多线程之生产者消费者问题<二>:使用重入锁、条件变量优雅地解决生产者消费者问题
来源:互联网 发布:塔利班和中国关系 知乎 编辑:程序博客网 时间:2024/04/29 01:47
Java5中新增了大量线程同步的功能,比如显式Lock,读写锁ReadWriteLock,条件变量Condition等,虽然这些功能使用之前的synchronized同步关键字都可能实现,但自己使用同步关键字不仅管理混乱,而且容易出错。 如下是使用显式Lock和条件变量Condition更好的解决生产者消费者问题,关于lock和condition读者可以自己查阅相关说明,也很好理解。
Consumer.java
package CreatorAndConsumer;public class Consumer implements Runnable { /** * 线程资源 */ private Plate plate; public Consumer(Plate plate) { this.plate = plate; } @Override public void run() { plate.getEgg(); }}Creator.java
package CreatorAndConsumer;/** * 生产者 * * @author Martin */public class Creator implements Runnable { /** * 线程资源 */ private Plate plate; public Creator(Plate plate) { this.plate = plate; } @Override public void run() { Object egg = new Object(); plate.addEgg(egg); }}
Plate.java
package CreatorAndConsumer;import java.util.List;import java.util.concurrent.locks.*;/** * 盘子,表示共享的资源 * * @author Martin */public class Plate { private List<Object> eggs = new ArrayList<Object>(); /** * 锁 */ private Lock lock; /** * 大于0条件变量,用于保证消费时有资源可消费 */ private Condition more0Condition; public Plate() { lock = new ReentrantLock(); more0Condition = lock.newCondition(); } /** * 获取蛋 * * @return */ public Object getEgg() { lock.lock(); try { while (eggs.size() < 1) { more0Condition.await(); } System.out.println("消费者取蛋,当前剩余:" + eggs.size()); Object egg = eggs.get(0); eggs.remove(0); return egg; } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } return null; } /** * 加入蛋 * * @return */ public void addEgg(Object egg) { lock.lock(); System.out.println("生产者生蛋,当前剩余:" + eggs.size()); eggs.add(egg); more0Condition.signalAll(); lock.unlock(); }}
Tester.java
package CreatorAndConsumer;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Tester { public static void main(String[] args) { //共享资源 Plate plate = new Plate(); ExecutorService pool = Executors.newFixedThreadPool(100); //添加生产者和消费者 for(int i = 0 ; i < 1000; i ++) { pool.execute(new Creator(plate)); pool.execute(new Consumer(plate)); } pool.shutdown(); }}
</pre><pre>
0 0
- Java多线程之生产者消费者问题<二>:使用重入锁、条件变量优雅地解决生产者消费者问题
- Java多线程之生产者消费者问题<三>:使用阻塞队列更优雅地解决生产者消费者问题
- Java多线程之生产者消费者问题<一>:使用synchronized 关键字解决生产者消费者问题
- 互斥锁加条件变量解决生产者消费者问题
- Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
- Java多线程解决生产者消费者问题
- java多线程之生产者消费者经典问题
- java多线程之生产者消费者问题
- java多线程之生产者消费者经典问题
- java多线程之生产者消费者经典问题
- java多线程之生产者消费者经典问题
- java基础:多线程之生产者消费者问题
- java多线程之生产者消费者经典问题
- java多线程之生产者消费者经典问题
- Java多线程之生产者/消费者问题
- java多线程之生产者消费者经典问题
- java多线程之生产者消费者问题
- java多线程之生产者消费者经典问题
- 浅谈ThreadLocal
- 前缀异或:XOR Segment (用的是前缀和的思想,所以暂且称这个方法为前缀异或)
- 欢迎使用CSDN-markdown编辑器
- SPRING循环依赖(circular reference)的解决方法
- 关于java开发技巧
- Java多线程之生产者消费者问题<二>:使用重入锁、条件变量优雅地解决生产者消费者问题
- uva10801
- Backbone源码分析-Backbone架构+流程图
- day13—HTML DOM编程
- 我的环境云初体验
- ionic + 高德地图定位
- CodeForces - 631A Interview (思想)水
- VIM
- 初识JavaScript