這篇文章給大家介紹怎么在Java中利用Lock實現(xiàn)一個生產(chǎn)者消費者模型,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
10年積累的成都做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有同仁免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
具體如下:
package com.expgiga.JUC; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 生產(chǎn)者消費者案例 */ 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, "生產(chǎn)者A").start(); new Thread(consumer, "消費者B").start(); new Thread(productor, "生產(chǎn)者C").start(); new Thread(consumer, "消費者D").start(); } } //店員 class Clerk { private int product = 0; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); //進(jìn)貨方法 public void get() { lock.lock(); try { while (product >= 1) { //為了避免虛假喚醒,應(yīng)該總是使用在循環(huán)中 System.out.println("產(chǎn)品已滿!"); 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("產(chǎn)品缺貨!"); try { condition.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + " : " + --product); condition.signalAll(); } finally { lock.unlock(); } } } //生產(chǎn)者 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(); } } }
運行結(jié)果:
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
產(chǎn)品已滿!
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
產(chǎn)品已滿!
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者B : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費者D : 0
關(guān)于怎么在Java中利用Lock實現(xiàn)一個生產(chǎn)者消費者模型就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。