日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程实战~Guarded Suspension模式

發布時間:2024/7/23 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程实战~Guarded Suspension模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Guarded Suspension 模式

????????比如,項目組團建要外出聚餐,我們提前預訂了一個包間,然后興沖沖地奔過去,到那兒后大堂經理看了一眼包間,發現服務員正在收拾,就會告訴我們:“您預訂的包間服務員正在收拾,請您稍等片刻。”過了一會,大堂經理發現包間已經收拾完了,于是馬上帶我們去包間就餐。

????????那我們來看看現實世界里是如何解決這類問題的呢?現實世界里大堂經理這個角色很重要,我們是否等待,完全是由他來協調的。通過類比,相信你也一定有思路了:我們的程序里,也需要這樣一個大堂經理。的確是這樣,那程序世界里的大堂經理該如何設計呢?其實設計方案前人早就搞定了,而且還將其總結成了一個設計模式:Guarded Suspension。所謂Guarded Suspension,直譯過來就是“保護性地暫停”。

class GuardedObject<T>{// 受保護的對象private T obj;final Lock lock = new ReentrantLock();final Condition done = lock.newCondition();final int timeout=1;// 獲取受保護對象 public T get(Predicate<T> p) {lock.lock();try {//MESA 管程推薦寫法while(!p.test(obj)){done.await(timeout, TimeUnit.SECONDS);}}catch(InterruptedException e){throw new RuntimeException(e);}finally{lock.unlock();}// 返回非空的受保護對象return obj;}// 事件通知方法public void onChanged(T obj) {lock.lock();try {this.obj = obj;done.signalAll();} finally {lock.unlock();}} }

擴展 Guarded Suspension 模式

????????每個發送到 MQ 的消息,都有一個唯一性的屬性 id,所以我們可以維護一個 MQ 消息 id 和GuardedObject 對象實例的關系,這個關系可以類比大堂經理大腦里維護的包間和就餐人的關系。

class GuardedObject<T>{// 受保護的對象T obj;final Lock lock = new ReentrantLock();final Condition done = lock.newCondition();final int timeout=2;// 保存所有 GuardedObjectfinal static Map<Object, GuardedObject> gos = new ConcurrentHashMap<>();// 靜態方法創建 GuardedObjectpublic static <K> GuardedObject create(K key){GuardedObject go=new GuardedObject();gos.put(key, go);return go;}public static <K, T> void fireEvent(K key, T obj){GuardedObject go=gos.remove(key);if (go != null){go.onChanged(obj);}}// 獲取受保護對象 public T get(Predicate<T> p) {lock.lock();try {//MESA 管程推薦寫法while(!p.test(obj)){done.await(timeout, TimeUnit.SECONDS);}}catch(InterruptedException e){throw new RuntimeException(e);}finally{lock.unlock();}// 返回非空的受保護對象return obj;}// 事件通知方法void onChanged(T obj) {lock.lock();try {this.obj = obj;done.signalAll();} finally {lock.unlock();}} }

利用擴展后的 GuardedObject 來解決消息反饋后處理很簡單了

// 處理瀏覽器發來的請求 Respond handleWebReq(){int id= 序號生成器.get();// 創建一消息Message msg1 = new Message(id,"{...}");// 創建 GuardedObject 實例GuardedObject<Message> go= GuardedObject.create(id); // 發送消息send(msg1);// 等待 MQ 消息Message r = go.get(t->t != null); }void onMessage(Message msg){// 喚醒等待的線程GuardedObject.fireEvent(msg.id, msg); }

總結

以上是生活随笔為你收集整理的Java并发编程实战~Guarded Suspension模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。