手寫乙個生產者 消費者模式(三種方式實現)

2021-09-18 03:11:41 字數 2909 閱讀 3120

這種設計模式需要滿足以下三點要求:

(1)生產者生產資料到緩衝區中,消費者從緩衝區中取資料。

(2)如果緩衝區已經滿了,則生產者執行緒阻塞;

(3)如果緩衝區為空,那麼消費者執行緒阻塞。

編寫之前分析:

(1)定義乙個快取佇列,選擇乙個集合當做快取,給予快取上限,快取佇列只有兩種行為(生產資料和消費資料);

(2)定義乙個生產者執行緒,呼叫快取佇列中的生產行為;

(3)定義乙個消費者執行緒,呼叫快取佇列中的消費行為;

開始編寫**:

第一種方式:

(雙向鍊錶linkedhashmap和synchronized結合)

定義乙個快取佇列

/**

* 公共快取佇列

* 只做兩件事:(1)生產;(2)消費

*/public class publicqueue catch (interruptedexception e)

}else

linkedhashmap.put(putindex, msg);

system.out.println("生產乙個產品,當前商品角標為:"+putindex+"===文字為:"+msg+"===快取長度為:"+linkedhashmap.size());

putindex = (putindex + 1 >= maxcount) ? (putindex + 1) % maxcount : putindex + 1;

}public synchronized t remove() catch (interruptedexception e)

}else

iterator it = linkedhashmap.entryset().iterator();

t t = null;

if(it.hasnext())

return t;

}}

定義乙個生產者執行緒

/**

* 生產者執行緒

*/public class producerthread extends thread

@override

public void run()

}}

定義乙個消費者執行緒

/**

* 消費者執行緒

*/public class consumerthread extends thread

@override

public void run()

}}

啟動:

public class producerconsumertest 

}

**分析:

(1)生產者/消費者設計模式顧名思義就是兩個互斥執行緒,乙個負責生產,乙個負責消費,兩者是執行緒不安全的;

(2)這裡選擇使用linkedhashmap作為快取佇列,linkedhashmap是乙個雙向鍊錶,用來處理執行緒不安全的資料,可以保證取出第乙個資料,it.next()就是取出第乙個資料。(linkedhashmap可以保證遍歷的順序)

(3)為了保證互斥執行緒的安全性,需要做對應的處理,以上**使用了synchronized 、wait()、notifyall()來保證。

第二種方式:

雙向鍊錶linkedhashmap和lock結合

/**

* 公共快取佇列

* 只做兩件事:(1)生產;(2)消費

*/public class publicqueue

private linkedhashmaplinkedhashmap = new linkedhashmap<>();//緩衝區

public void add(t msg)

linkedhashmap.put(putindex, msg);

system.out.println("生產乙個產品,當前商品角標為:"+putindex+"===文字為:"+msg+"===快取長度為:"+linkedhashmap.size());

putindex = (putindex + 1 >= maxcount) ? (putindex + 1) % maxcount : putindex + 1;

removecondition.signalall();//喚醒所有執行緒

} catch (interruptedexception e) finally

}public t remove()

iterator it = linkedhashmap.entryset().iterator();

if(it.hasnext())

addcondition.signalall();//喚醒所有執行緒

} catch (interruptedexception e) finally

return t;

}}

第三種方式:(最簡單的)

直接使用阻塞佇列blockingqueue

/**

* 公共快取佇列

* 只做兩件事:(1)生產;(2)消費

*/public class publicqueue catch (interruptedexception e)

system.out.println("生產乙個產品,當前商品角標為:"+"===文字為:"+msg);

}public t remove() catch (interruptedexception e)

system.out.println("消費乙個產品,當前商品角標為:"+"===文字為:"+t);

return t;

}}

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者 消費者模式

一 我哥們把資料存入redis快取區 生產者 二 我從緩衝器取資料,並作處理!消費者 詳細 如下 取訂單並判斷 redis new redis conn flag redis connect redis translate usefull host,redis translate usefull p...

生產者消費者模式

常見場景 某個模組負責產生資料,這些資料由另乙個模組來負責處理。產生資料的模組,就形象地稱為生產者 而處理資料的模組,就稱為消費者。該模式還需要有乙個緩衝區處於生產者和消費者之間,作為乙個中介。生產者把資料放入緩衝區,而消費者從緩衝區取出資料 緩衝區作用 1.解耦,生產者和消費者只依賴緩衝區,而不互...