使用ReentrantLock和Condition实现生产者消费者模型

使用ReentrantLock和Condition实现【生产者-消费者】。

/**
 * @author wzx
 * @time 2017/5/8
 */
public class ProducerConsumerSolutionUsingLock {

    public static void main(String[] args) throws InterruptedException {
        ProducerConsumerImpl producerConsumer = new ProducerConsumerImpl();
        Thread producer = new Thread(new Producer(producerConsumer));
        Thread producer2 = new Thread(new Producer(producerConsumer));
        Thread producer3 = new Thread(new Producer(producerConsumer));
        Thread consumer = new Thread(new Consumer(producerConsumer));
        Thread consumer2 = new Thread(new Consumer(producerConsumer));
        producer.start();
        producer2.start();
        producer3.start();
        consumer.start();
        consumer2.start();

        TimeUnit.SECONDS.sleep(3);
    }

    static class ProducerConsumerImpl {

        private static final int CAPACITY = 10;
        private final Queue<Integer> queue = new LinkedList();
        private final Random theRandom = new Random();

        private final ReentrantLock lock = new ReentrantLock();
        private final Condition bufferNotFull = lock.newCondition();
        private final Condition bufferNotEmpty = lock.newCondition();

        public void put() throws InterruptedException {
            lock.lock();

            try {
                while (true) {
                    while (queue.size() == CAPACITY) {
                        System.out.println("Buffer is full, waiting");
                        bufferNotEmpty.await();
                    }
                    int num = theRandom.nextInt();
                    boolean isAdded = queue.offer(num);
                    System.out.println("added " + num + " into queue");
                    if (isAdded) {
                        bufferNotFull.signalAll();
                    }
                }
            } finally {
                lock.unlock();
            }
        }

        public void get() throws InterruptedException {
            lock.lock();
            try {
                while (true) {
                    while (queue.size() == 0) {
                        System.out.println("Buffer is empty, waiting");
                        bufferNotFull.await();
                    }
                    Integer num = queue.poll();
                    if (num != null) {
                        System.out.println("consumed " + num + " from queue");
                        bufferNotEmpty.signalAll();
                    }
                }
            } finally {
                lock.unlock();
            }

        }


    }

    static class Producer implements Runnable {

        private ProducerConsumerImpl producerConsumer;

        public Producer(ProducerConsumerImpl producerConsumer) {
            this.producerConsumer = producerConsumer;
        }

        @Override
        public void run() {
            try {
                producerConsumer.put();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class Consumer implements Runnable {

        private ProducerConsumerImpl producerConsumer;

        public Consumer(ProducerConsumerImpl producerConsumer) {
            this.producerConsumer = producerConsumer;
        }

        @Override
        public void run() {
            try {
                producerConsumer.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    }

}

执行结果:

added 1892544024 into queue
added -444311193 into queue
added 1942706941 into queue
added -258892878 into queue
added -1318716428 into queue
added 1574586774 into queue
added 1202469039 into queue
added 432139815 into queue
added 283938192 into queue
Buffer is full, waiting
Buffer is full, waiting
Buffer is full, waiting
consumed -1898407557 from queue
consumed 1892544024 from queue
consumed -444311193 from queue
consumed 1942706941 from queue
consumed -258892878 from queue
consumed -1318716428 from queue
consumed 1574586774 from queue
consumed 1202469039 from queue
consumed 432139815 from queue
consumed 283938192 from queue
Buffer is empty, waiting
Buffer is empty, waiting

参考
http://javarevisited.blogspot.com/2015/06/java-lock-and-condition-example-producer-consumer.html#axzz4gOjkc8Yu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值