生产者消费者模型(单个生产者和单个消费者)
2016-04-07 14:16
471 查看
生产者消费者模型(单个生产者和单个消费者)
场景描述
多线程开发中很经典的一个案例就是生产者消费者模型,它们共享资源,但是对资源的操作方式并不同。因此它们需要协调资源,否则就会出现线程安全问题。代码展示
Resource Code/** * 生产者和消费者共享的资源Resource对象 * @author xuyi3 * @2016年4月7日 @下午2:01:21 * @Resource * @功能说明:<br> * @春风十里不如你 * @备注 */ public class Resource { /** 资源名称 */ private String name; /** 资源标识符 */ private boolean flag = false; //省略setter 和 getter 方法 }
ProductThread Code
/** * 生产者线程 * @author xuyi3 * @2016年4月7日 @下午1:38:16 * @ProductThread * @功能说明:生产产品<br> * @春风十里不如你 * @备注 */ public class ProductThread implements Runnable { //共享资源Resource对象 private Resource resource; public ProductThread(Resource resource) { this.resource = resource; } @Override public void run() { int count = 1; // 生产产品 while (true) { synchronized (resource) {//共享资源对象(同步的锁要相同否则就错误) if (resource.isFlag()) {// 标识已经有资源 // wait(); try { resource.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { // 生产资源 resource.setName("产品" + count); System.out.println("生产者生产--->" + resource.getName()); count++; resource.setFlag(true); // notify(); resource.notify(); } } } } }
ConsumerThread Code
/** * 消费者对象 * @author xuyi3 * @2016年4月7日 @下午2:07:22 * @ConsumerThread * @功能说明:<br> * @春风十里不如你 * @备注 */ public class ConsumerThread implements Runnable { // 共享资源Resource对象 private Resource resource; public ConsumerThread(Resource resource) { this.resource = resource; } @Override public void run() { while (true) { synchronized (resource) {//共享资源对象(同步的锁要相同否则就错误) if (!resource.isFlag()) {// 标识没有数据 // wait() try { resource.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { System.out.println("消费者消费===》" + resource.getName()); resource.setFlag(false);// 标识已经消费了 // notify() resource.notify(); } } } } }
AppMain Code
public class AppMain { public static void main(String[] args) { // 共享资源对象 Resource resource = new Resource(); // 创建生产者对象 ProductThread productThread = new ProductThread(resource); // 创建消费者对象 ConsumerThread consumerThread = new ConsumerThread(resource); // 启动两个线程 new Thread(productThread).start(); new Thread(consumerThread).start(); } }
总结说明
单个生产者和单个消费者模型实现的关键在于,资源共享(同步同个对象锁)和资源的标识以及等待唤醒机制wait()和notify()方法。相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)
- C#实现多线程的Web代理服务器实例