码迷,mamicode.com
首页 > 编程语言 > 详细

Condition线程通信_生产者消费者案例

时间:2020-04-04 16:13:52      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:cat   unlock   pre   rod   util   消费者   test   finally   不同   

①Condition 接口描述了可能会与锁有关联的条件变量。

这些变量在用 法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的 功能。

需要特别指出的是,单个 Lock 可能与多个 Condition 对象关 联。

为了避免兼容性问题,Condition 方法的名称与对应的 Object 版 本中的不同。
② 在 Condition 对象中,与 wait、notify 和 notifyAll 方法对应的分别是 await、signal 和 signalAll。
③ Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,请使用其 newCondition() 方法

TestProductorAndConsumer1

package com.aff.juc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//生产者消费者案例,Lock
public class TestProductorAndConsumer1 {
    public static void main(String[] args) {
        Clerk1 clerk1 = new Clerk1();
        Productor1 pro = new Productor1(clerk1);
        Consumer1 cus = new Consumer1(clerk1);

        new Thread(pro, "生产者A").start();
        new Thread(cus, "消费者B").start();
        new Thread(pro, "生产者C").start();
        new Thread(cus, "消费者D").start();
    }
}

// 店员
class Clerk1 {
    private int product = 0;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

    // 进货
    public void get() {
        lock.lock();// 上锁
        try {
            while (product >= 1) {  // 为了避免虚假唤醒问题,应该总是使用在循环中
                System.out.println("产品已满");
                try {
                    condition.await();
                } catch (InterruptedException e) {
                }
            }
            System.out.println(Thread.currentThread().getName() + ":" + ++product);
            condition.signalAll();
        }finally {
            lock.unlock();
        }
    }
    
    // 卖货
    public void sale() {
        lock.lock();
        try {
            while (product <= 0) {
                System.out.println("缺货");
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + ":" + --product);
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }
}
    // 生产者
    class Productor1 implements Runnable {
        private Clerk1 clerk1;

        public Productor1(Clerk1 clerk) {
            this.clerk1 = clerk;
        }

        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                try {
                    Thread.sleep(200);
                } catch (Exception e) {
                }
                clerk1.get();
            }
        }
    }

    // 消费者
class Consumer1 implements Runnable {
    private Clerk1 clerk1;

    public Consumer1(Clerk1 clerk) {
        this.clerk1= clerk;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            clerk1.sale();
        }
    }
 }

 

Condition线程通信_生产者消费者案例

标签:cat   unlock   pre   rod   util   消费者   test   finally   不同   

原文地址:https://www.cnblogs.com/afangfang/p/12632210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!