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庫的函式不一定能滿足互斥條件。也就是不一定安全。最後,所有資源...