国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平凉市| 松原市| 定兴县| 常州市| 商河县| 日照市| 东丽区| 大理市| 广丰县| 大新县| 伊宁县| 民丰县| 天津市| 建德市| 泗水县| 光山县| 林甸县| 枣强县| 庆城县| 淳安县| 盐边县| 绥滨县| 疏勒县| 大丰市| 永川市| 房产| 龙口市| 防城港市| 聂荣县| 康马县| 高州市| 邻水| 上思县| 张家港市| 泊头市| 八宿县| 龙泉市| 星子县| 开江县| 洪湖市| 英德市|