首页 > 开发 > Java > 正文

Java基于Lock的生产者消费者模型示例

2024-07-14 08:42:09
字体:
来源:转载
供稿:网友

本文实例讲述了Java基于Lock的生产者消费者模型。分享给大家供大家参考,具体如下:

前面一篇《Java锁机制Lock用法》简单介绍了锁机制,这里进一步分析一下基于lock的生产者消费者模型。

package com.expgiga.JUC;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 生产者消费者案例 */public class TestProductorAndConsumerForLock {  public static void main(String[] args) {    Clerk clerk = new Clerk();    Productor productor = new Productor(clerk);    Consumer consumer = new Consumer(clerk);    new Thread(productor, "生产者A").start();    new Thread(consumer, "消费者B").start();    new Thread(productor, "生产者C").start();    new Thread(consumer, "消费者D").start();  }}//店员class Clerk {  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) {          e.printStackTrace();        }      }      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 Productor implements Runnable {  private Clerk clerk;  public Productor(Clerk clerk) {    this.clerk = clerk;  }  @Override  public void run() {    for (int i = 0; i < 20; i++) {      try {        Thread.sleep(200);      } catch (InterruptedException e) {        e.printStackTrace();      }      clerk.get();    }  }}//消费者class Consumer implements Runnable {  private Clerk clerk;  public Consumer(Clerk clerk) {    this.clerk = clerk;  }  @Override  public void run() {    for (int i = 0; i < 20; i++) {      clerk.sale();    }  }}

运行结果:

产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
产品已满!
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
产品已满!
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
产品缺货!
生产者C : 1
消费者B : 0
产品缺货!
产品缺货!
生产者A : 1
消费者B : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0
产品缺货!
生产者C : 1
消费者D : 0
产品缺货!
生产者A : 1
消费者D : 0

希望本文所述对大家java程序设计有所帮助。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表