您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么在Java中利用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中利用Lock實現一個生產者消費者模型就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。