Java多線程 Producer and Consumer設(shè)計(jì)模式
producer
是生產(chǎn)者的意思:指生產(chǎn)數(shù)據(jù)的線程,consumer
是消費(fèi)者的意思:指的是使用數(shù)據(jù)的線程
public class ProducerThread extends Thread { private final static Random random = new Random(System.currentTimeMillis()); private final static AtomicInteger counter = new AtomicInteger(0); private final MessageQueue messageQueue; public ProducerThread(MessageQueue messageQueue, int seq) { super("Producer-" + seq); this.messageQueue = messageQueue; } @Override public void run() { while (true) { try { Message message = new Message("Message-" + counter.getAndIncrement()); messageQueue.put(message); System.out.println(Thread.currentThread().getName() + " put message " + message.getData()); Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { break; } } } }
public class ConsumerThread extends Thread { private final static Random random = new Random(System.currentTimeMillis()); private final MessageQueue messageQueue; public ConsumerThread(MessageQueue messageQueue, int seq) { super("Consumer-" + seq); this.messageQueue = messageQueue; } @Override public void run() { while (true) { try { Message message = messageQueue.take(); System.out.println(Thread.currentThread().getName() + " take a message " + message.getData()); Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { break; } } } }
public class Message { public Message(String data) { this.data = data; } private String data; public String getData() { return data; } public void setData(String data) { this.data = data; } }
public class MessageQueue { private final static int DEFAULT_MAX_LIMIT = 100; private final LinkedList<Message> queue; private final int limit; public MessageQueue() { this(DEFAULT_MAX_LIMIT); } public MessageQueue(final int limit) { this.limit = limit; this.queue = new LinkedList<>(); } public void put(final Message message) throws InterruptedException { synchronized (queue) { while (queue.size() > limit) { queue.wait(); } queue.addLast(message); queue.notifyAll(); } } public Message take() throws InterruptedException { synchronized (queue) { while (queue.isEmpty()) { queue.wait(); } Message message = queue.removeFirst(); queue.notifyAll(); return message; } } public int getMaxLimit() { return this.limit; } public int getMessageSize() { synchronized (queue) { return queue.size(); } } }
public class ProducerAndConsumerClient { public static void main(String[] args) { final MessageQueue messageQueue = new MessageQueue(); new ProducerThread(messageQueue, 1).start(); new ProducerThread(messageQueue, 2).start(); new ProducerThread(messageQueue, 3).start(); new ConsumerThread(messageQueue, 1).start(); new ConsumerThread(messageQueue, 2).start(); } }
Producer-1 put message Message-0
Producer-3 put message Message-2
Producer-2 put message Message-1
Consumer-1 take a message Message-0
Consumer-2 take a message Message-1
Producer-2 put message Message-3
Consumer-1 take a message Message-2
Producer-2 put message Message-4
Consumer-2 take a message Message-3
Producer-3 put message Message-5
Producer-3 put message Message-6
Producer-3 put message Message-7
Consumer-1 take a message Message-4
Producer-2 put message Message-8
Consumer-2 take a message Message-5
Producer-3 put message Message-9
Producer-1 put message Message-10
Producer-1 put message Message-11
Producer-2 put message Message-12
省略...
到此這篇關(guān)于Java多線程 Producer and Consumer設(shè)計(jì)模式的文章就介紹到這了,更多相關(guān)Java多線程 Producer、Consumer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis insert foreach循環(huán)插入方式
這篇文章主要介紹了mybatis insert foreach循環(huán)插入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Spring?Boot?項(xiàng)目中?JPA?語(yǔ)法的基本使用方法
這篇文章主要介紹了?Spring?Boot?項(xiàng)目中?JPA?語(yǔ)法的基本使用方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10基于spring security實(shí)現(xiàn)登錄注銷(xiāo)功能過(guò)程解析
這篇文章主要介紹了基于spring security實(shí)現(xiàn)登錄注銷(xiāo)功能過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01使用maven命令安裝jar包到本地倉(cāng)庫(kù)的方法步驟
這篇文章主要介紹了使用maven命令安裝jar包到本地倉(cāng)庫(kù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06SpringBoot靜態(tài)資源映射規(guī)則淺析
這篇文章主要介紹了SpringBoot靜態(tài)資源映射規(guī)則,今天在玩SpringBoot的demo的時(shí)候,放了張圖片在resources目錄下,啟動(dòng)區(qū)訪問(wèn)的時(shí)候,突然好奇是識(shí)別哪些文件夾來(lái)展示靜態(tài)資源的, 為什么有時(shí)候放的文件夾不能顯示,有的卻可以2023-02-02Java8方法引用及構(gòu)造方法引用原理實(shí)例解析
這篇文章主要介紹了Java8方法引用及構(gòu)造方法引用原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09spring boot項(xiàng)目生成docker鏡像并完成容器部署的方法步驟
這篇文章主要介紹了spring boot項(xiàng)目生成docker鏡像并完成容器部署的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java NIO Selector用法詳解【含多人聊天室實(shí)例】
這篇文章主要介紹了Java NIO Selector用法,結(jié)合實(shí)例形式分析了Java NIO Selector基本功能、原理與使用方法,并結(jié)合了多人聊天室實(shí)例加以詳細(xì)說(shuō)明,需要的朋友可以參考下2019-11-11