java多线程之生产者和消费者模型
2016-01-07 10:32
483 查看
生产者和消费者模型
public class Model { public static void main(String[] args) { Resource r = new Resource(); Producer p1 = new Producer(r); Producer p2 = new Producer(r); Producer p3 = new Producer(r); Consumer c1 = new Consumer(r); Consumer c2 = new Consumer(r); Consumer c3 = new Consumer(r); new Thread(p1).start(); new Thread(p2).start(); new Thread(p3).start(); new Thread(c1).start(); new Thread(c2).start(); new Thread(c3).start(); } } /** * 实现内存共享 * 加锁的前提条件: * 1。有共享数据 * 2。有多条指令对共有数据进行操作 * 同步: * 有多个线程对共享数据操作 * @author admin * */ class Resource { private int count = 1; private String name; private boolean flag = true; private Lock lock = new ReentrantLock(); //建立互斥所 // private Condition con = lock.newCondition(); //获得监视器 private Condition producer_con = lock.newCondition(); private Condition consumer_con = lock.newCondition(); //生产鸭子 public void produce(String name) { lock.lock(); try{ while(flag){ //有鸭子,需要消费,生产线程等待,唤醒消费线程 try { producer_con.await(); } catch (InterruptedException e) { e.printStackTrace(); } } //没有鸭子,进行生产 count++; this.name = name; System.out.println(Thread.currentThread().getName()+this.name+",数量为:"+count); flag = true; //表示生产出鸭子 consumer_con.signal(); } //解锁 finally { lock.unlock(); } } //消费鸭子 public void consume(String name) { lock.lock(); try{ while(!flag){ //没有鸭子了,需要生产了 try { consumer_con.await(); } catch (InterruptedException e) { e.printStackTrace(); } } //有鸭子,进行消费 this.name = name; System.out.println(Thread.currentThread().getName()+this.name+",数量为:"+count); flag = false; //表示鸭子已经消费了 producer_con.signal(); } finally{ lock.unlock(); } } } class Producer implements Runnable { // 共享资源 private Resource resource; // 初始化资源 public Producer(Resource resource) { this.resource = resource; } // 实现生产者的调用 @Override public void run() { while (true) { resource.produce("生产鸭子"); } } } class Consumer implements Runnable { // 共享资源 private Resource resource; // 初始化资源 public Consumer(Resource resource) { this.resource = resource; } // 实现生产者的调用 @Override public void run() { while (true) { resource.consume("消费鸭子"); } } }
相关文章推荐
- IntelliJ IDEA编译报错Error:java: Compilation failed: internal java compiler error
- spring 4.0.3整合Hessian4.0.38 IDEA
- 【Android基础 008】 Eclipse Devices中查看不到真实android设备的解决方法
- java.io.FileNotFoundException: Too many open files
- Eclipse更改workspace路径
- Java解释器模式
- C# 调用 JavaWebservice服务遇到的问题汇总
- Java 8:如何使用流方式查询数据库?
- Java 8:如何使用流方式查询数据库?
- Java transient,Volatile关键字
- springmvc学习
- 一劳永逸_修改maven 默认使用的JDK
- Java杂记1--类与对象
- java-泛型
- Java面向对象的一些理解重点和难点
- Java EE V7.0学习笔记:JPA
- javascipt模块化编程(速记)
- adnroid java 获取汉字 字母的首拼音,全拼音,大写首拼音
- 邮件开发:Javamail、JAF简介
- SpringMVC各类jar包使用详解