10 SDR 阻塞佇列實現生產者消費者模式

2021-09-22 21:04:17 字數 1935 閱讀 2523

redis 預設的發布訂閱模式, 當有訊息產生時, 所有訂閱該頻道channel的客戶端都會接收到訊息。 有時我們希望乙個訊息只能被乙個客戶端消費,也就是類似於生產者消費者模式,我們可以借助於redis 的阻塞佇列來實現. 借助於redis 阻塞佇列實現的生產者消費者模式,有以下特點:

public

class

consumerdemonthread

implements

runnable

@override

public

void

run(

)catch

(exception e)}}

/** * @description: 執行訊息任務

* @param message 訊息

* @author: zongf

* @time: 2019-03-13 14:10:43

*/private

void

domessagetask

(string message)

catch

(interruptedexception e)}}

/** * @description: 從阻塞佇列中讀取訊息

* @return: string 訊息

* @author: zongf

* @time: 2019-03-13 14:11:15

*/private string readmessagefromblockingqueue()

});// 格式化讀取到的結果

list

list =

(list

) resultlist;

// 如果獲取結果為null, 正常不會出現這種情況

if(list == null || list.

size()

<2)

// 讀取返回的list 結構時[佇列名稱, value] 結構, 而並非時單獨的value.

if(queue_name.

equals

(list.

get(0)

))return null;

}}

@component

public

class

consumerdemonthreadpoolstarter

}}

生產者開發相對簡單,就呼叫list相關的api向list中push 訊息即可.

@runwith

(springrunner.

class

)@springboottest

public

class

producertest

}}

127.0.0.1:6379> lpush block-queue a

(integer) 1

127.0.0.1:6379> lpush block-queue b

(integer) 1

pool-1-thread-5-開始消費訊息: a

pool-1-thread-4-開始消費訊息: b

pool-1-thread-1-開始消費訊息: c

pool-1-thread-2-開始消費訊息: d

pool-1-thread-3-開始消費訊息: e

pool-1-thread-5-開始消費訊息: k

pool-1-thread-4-開始消費訊息: l

pool-1-thread-1-開始消費訊息: m

pool-1-thread-2-開始消費訊息: n

pool-1-thread-3-開始消費訊息: o

pool-1-thread-5-開始消費訊息: u

阻塞佇列之生產者與消費者

前段時間因為專案中對生產者與消費者的需求,故整理了一下對阻塞佇列。不說了,直接上 public class blockingqueuetest public void run catch interruptedexception e public void shutdown 消費者 public s...

生產者 消費者阻塞佇列 高併發版

主要是通過blockingqueue volatile atomicinteger等方式來實現,保證執行緒安全和資料一致性 高併發的生產者消費者阻塞佇列 volatile cas atomicinteger blockingqueue 執行緒互動 原子引用 public class myresour...

C 實現生產者消費者佇列

結果分析 原始碼位址 首先,我們的生產者與消費者佇列需要滿足同步與互斥關係,就需要一把互斥鎖,以及生產者與消費者各自的條件變數。其次,我們可以利用c 中stl裡的queue佇列來進行實現,但是我們需要對push,pop進行修改,因為stl庫的函式不一定能滿足互斥條件。也就是不一定安全。最後,所有資源...