【Java併發】生產者-消費者模式簡單實現(模擬訊息佇列)
簡單的模擬了一個訊息佇列
Producer:生產者
Consumer:消費者
Message:訊息體
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class Test4 {
public static void main(String[] args) {
BlockingQueue<Message> blockingQueue = new ArrayBlockingQueue<Message>(10 );
Producer producer = new Producer(blockingQueue);
//啟動一個消費者
Consumer consumer = new Consumer(blockingQueue);
Thread consumerThread = new Thread(consumer);
consumerThread.start();
int n = 0;
//模擬生產者發訊息
while (true){
Message message = new Message();
message.setTopic("hello("+n+")");
message.setBody("nice to meet you("+n+")");
System.out.println("傳送訊息:"+message.toString());
producer.send(message);
n++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Producer{
private BlockingQueue<Message> messageQueue;
private volatile Message message;
public Message getMessage() {
return message;
}
public void setMessage(Message message) {
this.message = message;
}
public Producer(BlockingQueue<Message> messageQueue){
this.messageQueue = messageQueue;
}
public void send(Message message){
try {
this.messageQueue.put(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable{
private volatile Message message;
private String topic;
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
private BlockingQueue<Message> blockingQueue;
public Consumer(BlockingQueue<Message> blockingQueue){
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
while (true) {
if (!blockingQueue.isEmpty()) {
try {
System.out.println("收到訊息:" + blockingQueue.take().toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class Message {
private String topic;
private String body;
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
@Override
public String toString() {
return "{topic:" + topic + ",body:" + body + "}";
}
}
相關推薦
【Java併發】生產者-消費者模式簡單實現(模擬訊息佇列)
簡單的模擬了一個訊息佇列 Producer:生產者 Consumer:消費者 Message:訊息體 import java.util.concurrent.ArrayBlockingQueue; import java.util.c
【Java】生產者消費者模式的實現
前言 生產者消費者問題是執行緒模型中的經典問題:生產者和消費者在同一時間段內共用同一儲存空間,生產者向空間裡生產資料,而消費者取走資料。 阻塞佇列就相當於一個緩衝區,平衡了生產者和消費者的處理能力。這個阻塞佇列就是用來給生產者和消費者解耦的。 wa
Java併發學習--生產者/消費者模式
生產者/消費者模式是面向過程的一種高效設計模式。 生產者/消費者模式定義: 生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔
【BZOJ3502/2288】PA2012 Tanie linie/【POJ Challenge】生日禮物 堆+鏈表(模擬費用流)
line make 前驅 string urn return namespace 禮物 iostream 【BZOJ3502】PA2012 Tanie linie Description n個數字,求不相交的總和最大的最多k個連續子序列。 1<= k<
【Java學習】單例模式
{} on() new 情況下 餓漢模式 syn 效率 存在 情況 單例模式有兩種:餓漢模式和懶漢模式,懶漢模式的特點是延遲加載實例 //餓漢模式class Singleton1{ private static final Singleton1 instance = ne
java——利用生產者消費者模式思想實現簡易版handler機制
參考教程:http://www.sohu.com/a/237792762_659256 首先介紹每一個類: 1.Message: 這個類的作用是儲存一個生產者生產出來的具體的訊息,就類似連結串列佇列中的一個節點,自行定義需要儲存的內容。 code:訊息要執行的具體動作程式碼 msg:訊息
【Java併發】Executor框架
Executor框架 Executor框架結構 ThreadPoolExecutor FixedThreadPool SingleThreadExecutor newCachedThreadPool Schedul
【Java併發】Java中的原子操作
Java中的原子操作 原子更新基本型別 原子更新陣列 原子更新引用型別 原子更新欄位類 參考 原子更新基本型別 一個生動的例子 public class AtomicIntegerExample { privat
【Java併發】Java中的執行緒池
Java中的執行緒池 執行流程 執行緒池的建立 提交任務 關閉執行緒池 參考 執行流程 處理流程如下: execute()方法執行示意圖如下: 執行緒池的建立 corePoolSize:執行緒池
【Java併發】CountDownLatch、CyclicBarrier、Semaphore、Exchanger
CountDownLatch、CyclicBarrier、Semaphore、Exchanger CountDownLatch CyclicBarrier Semaphore Exchanger 參考 CountDownLa
【Java併發】Lock 和 Condition
Lock 和 Condition Lock 介面 ReentrantLock ReentrantReadWriteLock Condition 參考 Lock 介面 在Lock接口出現之前,Java程式是靠synchro
【Java併發】Daemon、Interrupt、Wait/Notify、Join、ThreadLocal、Pipe
Daemon、Interrupt、Wait/Notify、Join、ThreadLocal、Pipe 關於執行緒 Daemon Interrupt Wait/Notify Join ThreadLocal Pipe 參考
【Java併發】volatile 和 final
volatile 和 final 重排序 資料依賴性 as-if-serial語義 重排序對多執行緒的影響 happens - before 規則 volatile記憶體語義 final記憶體語義 參考
【Java併發】synchronized之偏向鎖和輕量級鎖
synchronized之偏向鎖和輕量級鎖 上下文切換 synchronized 鎖的升級與對比 偏向鎖 輕量級鎖 參考 上下文切換 即使是單核處理器也支援多執行緒執行程式碼執行程式碼,CPU通
【Java併發】二、JVM記憶體模型
JVM記憶體模型 什麼是Java記憶體模型 Java記憶體模型即Java Memory Model,簡稱JMM。JMM定義了Java 虛擬機器(JVM)在計算機記憶體(RAM)中的工作方式。JVM是整個計算機虛擬模型,所以JMM是隸屬於JVM的。 想要理解Ja
【死磕Java併發】- 深入分析volatile的實現原理
通過前面一章我們瞭解了synchronized是一個重量級的鎖,雖然JVM對它做了很多優化,而下面介紹的volatile則是輕量級的synchronized。如果一個變數使用volatile,則它比使用synchronized的成本更加低,因為它不會引起執行緒上下文的切換和排程。Java語言
【java併發】執行緒併發庫的使用
1. 執行緒池的概念 在java5之後,就有了執行緒池的功能了,在介紹執行緒池之前,先來簡單看一下執行緒池的概念。假設我開了家諮詢公司,那麼每天會有很多人過來諮詢問題,如果我一個個接待的話,必
【Java併發】JUC—ReentrantReadWriteLock有坑,小心讀鎖!
好長一段時間前,某些場景需要JUC的讀寫鎖,但在某個時刻內讀寫執行緒都報超時預警(長時間無響應),看起來像是鎖競爭過程中出現死鎖(我猜)。經過排查專案並沒有能造成死鎖的可疑之處,因為業務程式碼並不複雜(僅僅是一個計算過程),經幾番折騰,把注意力轉移到JDK原始碼,正文詳細說下ReentrantReadWrit
【java併發】條件阻塞Condition的應用
Condition將Object監視器方法(wait、notify 和 notifyAll)分解成截然不同的物件,以便通過將這些物件與任意Lock實現組合使用,為每個物件提供多個等待 set(wait-set)。其中,Lock 替代了synchroniz
【死磕Java併發】--深入分析volatile的實現原理
通過前面一章我們瞭解了synchronized是一個重量級的鎖,雖然JVM對它做了很多優化,而下面介紹的volatile則是輕量級的synchronized。如果一個變數使用volatile,則它比使用synchronized的成本更加低,因為它不會引起執行緒上下文的切換和排