Java基于Lock的生產(chǎn)者消費(fèi)者模型示例
本文實(shí)例講述了Java基于Lock的生產(chǎn)者消費(fèi)者模型。分享給大家供大家參考,具體如下:
前面一篇《Java鎖機(jī)制Lock用法》簡(jiǎn)單介紹了鎖機(jī)制,這里進(jìn)一步分析一下基于lock的生產(chǎn)者消費(fèi)者模型。
package com.expgiga.JUC;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 生產(chǎn)者消費(fèi)者案例
*/
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, "消費(fèi)者B").start();
new Thread(productor, "生產(chǎn)者C").start();
new Thread(consumer, "消費(fèi)者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();
}
}
}
//消費(fèi)者
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();
}
}
}
運(yùn)行結(jié)果:
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
產(chǎn)品已滿!
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
產(chǎn)品已滿!
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者B : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者C : 1
消費(fèi)者D : 0
產(chǎn)品缺貨!
生產(chǎn)者A : 1
消費(fèi)者D : 0
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java進(jìn)程與線程操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- Java實(shí)現(xiàn)Kafka生產(chǎn)者消費(fèi)者代碼實(shí)例
- kafka生產(chǎn)者和消費(fèi)者的javaAPI的示例代碼
- 基于Java 生產(chǎn)者消費(fèi)者模式(詳細(xì)分析)
- Java實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題與讀者寫者問題詳解
- Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解
- JAVA多線程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者的實(shí)例詳解
- Java 生產(chǎn)者/消費(fèi)者問題實(shí)例詳解
- Java多種方式實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式
相關(guān)文章
java 打印一字符串,并在main()方法內(nèi)調(diào)用它
編寫一個(gè)方法(名字自定,但要符合Java編碼規(guī)范),方法內(nèi)打印一字符串,并在main()方法內(nèi)調(diào)用它。2017-02-02
Spring boot整合Mybatis實(shí)現(xiàn)級(jí)聯(lián)一對(duì)多CRUD操作的完整步驟
這篇文章主要給大家介紹了關(guān)于Spring boot整合Mybatis實(shí)現(xiàn)級(jí)聯(lián)一對(duì)多CRUD操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
詳解JavaScript中的函數(shù)聲明和函數(shù)表達(dá)式
這篇文章主要介紹了詳解JavaScript中的函數(shù)聲明和函數(shù)表達(dá)式,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08
SpringBoot3.x中spring.factories?SPI?服務(wù)發(fā)現(xiàn)機(jī)制的改變問題小結(jié)
spring.factories其實(shí)是SpringBoot提供的SPI機(jī)制,底層實(shí)現(xiàn)是基于SpringFactoriesLoader檢索ClassLoader中所有jar引入的META-INF/spring.factories文件,這篇文章主要介紹了SpringBoot3.x中spring.factories?SPI?服務(wù)發(fā)現(xiàn)機(jī)制的改變,需要的朋友可以參考下2023-05-05
利用ssh實(shí)現(xiàn)服務(wù)器文件上傳下載
這篇文章主要為大家詳細(xì)介紹了如何利用ssh實(shí)現(xiàn)服務(wù)器文件上傳下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
手把手教你在eclipse創(chuàng)建第一個(gè)java?web項(xiàng)目并運(yùn)行
Eclipse是用來做開發(fā)的自由集成開發(fā)環(huán)境,這也是很多java程序員會(huì)使用的開發(fā)環(huán)境,所以可以使用eclipse創(chuàng)建javaweb項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于如何在eclipse創(chuàng)建第一個(gè)java?web項(xiàng)目并運(yùn)行的相關(guān)資料,需要的朋友可以參考下2023-02-02

