zoukankan      html  css  js  c++  java
  • java的多生产者多消费者例子

    import java.util.concurrent.locks.*;


    public class Test9 {

    public static void main(String[] args) {
    // TODO 自动生成的方法存根
    Resource r=new Resource();
    Producer p=new Producer(r);
    Consumer c=new Consumer(r);
    Thread t0=new Thread(p);
    Thread t1=new Thread(p);
    Thread t2=new Thread(c);
    Thread t3=new Thread(c);
    t0.start();
    t1.start();
    t2.start();
    t3.start();
    }

    }

    class Resource
    {
    private String name;
    private int count=1;
    private boolean flag;

    //创建一个锁对象。
    Lock lock ;
    //通过已有的锁获取两组监视器对象,一组监视生产者,一组监视消费者。
    Condition producer_con ;
    Condition consumer_con ;
    public Resource()
    {
    this.lock= new ReentrantLock();
    this.producer_con = lock.newCondition();
    this.consumer_con = lock.newCondition();
    }

    public void set(String name)
    {
    lock.lock();
    try {
    while(flag)
    producer_con.await();
    this.name=name+count;
    count++;
    System.out.println(Thread.currentThread().getName()+"....生产者..."+this.name);
    flag=true;
    consumer_con.signal();
    } catch (InterruptedException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    }finally{
    lock.unlock();
    }
    }
    public void get()
    {
    lock.lock();
    try {
    while(!flag)
    consumer_con.await();
    System.out.println(Thread.currentThread().getName()+"....消费者......."+this.name);
    flag=false;
    producer_con.signal();
    } catch (InterruptedException e) {
    // TODO 自动生成的 catch 块
    e.printStackTrace();
    }finally{
    lock.unlock();
    }

    }
    }
    class Producer implements Runnable
    {

    Resource r=null;
    public Producer(Resource r)
    {
    this.r=r;
    }
    public void run() {
    // TODO 自动生成的方法存根
    while(true)
    r.set("烤鸭");
    }

    }

    class Consumer implements Runnable
    {

    Resource r=null;
    public Consumer(Resource r)
    {
    this.r=r;
    }
    public void run() {
    // TODO 自动生成的方法存根
    while(true)
    r.get();
    }
    }

  • 相关阅读:
    Java 破解谷歌翻译api,可以实现程序自动化翻译文章
    如何搭建高可用redis架构?
    架构师带你玩转分布式锁
    Java8内存模型—永久代(PermGen)和元空间(Metaspace)
    【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
    kafka为什么这么优秀!
    讲道理,为什么分布式一定要有Redis?
    Windows系统内存分析工具的介绍
    colspan width issue
    OpenGL ES3 非常好的系列文章
  • 原文地址:https://www.cnblogs.com/ql211lin/p/3975945.html
Copyright © 2011-2022 走看看