java多线程之生产者和消费者模型

来源:互联网 发布:vivowifi备份软件 编辑:程序博客网 时间:2024/04/25 22:55

生产者和消费者模型

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("消费鸭子");        }    }}
0 0
原创粉丝点击