生產(chǎn)者與消費(fèi)者

使用BlockingQueue模擬生產(chǎn)者與消費(fèi)者

class Producer extends Thread{
  private BlockingQueue queue;
  private volatile boolean flag=true;
  private static AtomicInteger count=new AtomicInteger();

  public Producer(BlockingQueue queue){
    this.queue=queue;
  }
  @Override
  public void run() {
    System.out.println(getName()+"生產(chǎn)者線程啟動(dòng)...");
    try {
        while (flag){
            System.out.println(getName()+"生產(chǎn)者開始生產(chǎn)消息...");
            //如果flag為true,queue就入隊(duì)列。(原子類進(jìn)行計(jì)數(shù))
            Integer i = count.incrementAndGet();
            boolean offer = queue.offer(i);
            if(offer){
                System.out.println(getName()+"生產(chǎn)者生產(chǎn)生產(chǎn)消息:"+i+"成功");
            }else {
                System.out.println(getName()+"生產(chǎn)者生產(chǎn)生產(chǎn)消息:"+i+"失敗");
            }
            Thread.sleep(1000);
        }
    }catch (Exception e){

    }finally {
        System.out.println(getName()+"生產(chǎn)者線程停止...");
    }
  }

  public void stopThread(){
    this.flag=false;
  }
}


class Consumer extends Thread{
  private BlockingQueue queue;
  private volatile boolean flag=true;

  public Consumer(BlockingQueue queue){
    this.queue=queue;
  }
  @Override
  public void run() {
    System.out.println(getName()+"消費(fèi)者線程啟動(dòng)...");
    try {
        while (flag){
            System.out.println(getName()+"消費(fèi)者開始消費(fèi)消息...");
            //如果flag為true盖喷,queue就出隊(duì)列
            Integer poll = (Integer) queue.poll(2, TimeUnit.SECONDS);
            if(poll != null){
                System.out.println(getName()+"消費(fèi)者獲取消息:"+poll+"成功");
            }else {
                System.out.println(getName()+"消費(fèi)者獲取消息:"+poll+"失敗");
                this.flag=false;
            }

        }
    }catch (Exception e){

    }finally {
        System.out.println(getName()+"消費(fèi)者線程停止...");
    }
  }
}

public class ProduceConsumerThread {
  public static void main(String[] args) throws InterruptedException {
    BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);
    Producer p1 =new Producer(queue);
    Producer p2 =new Producer(queue);
    Consumer c1 =new Consumer(queue);

    p1.start();
    p2.start();
    c1.start();

    Thread.sleep(3*1000);
    p1.stopThread();
    p2.stopThread();
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末并淋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挠羔,更是在濱河造成了極大的恐慌灰伟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件养晋,死亡現(xiàn)場離奇詭異,居然都是意外死亡梁钾,警方通過查閱死者的電腦和手機(jī)绳泉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姆泻,“玉大人零酪,你說我怎么就攤上這事∧床” “怎么了四苇?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長方咆。 經(jīng)常有香客問我月腋,道長,這世上最難降的妖魔是什么瓣赂? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任榆骚,我火速辦了婚禮,結(jié)果婚禮上钩述,老公的妹妹穿的比我還像新娘寨躁。我一直安慰自己,他們只是感情好牙勘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布职恳。 她就那樣靜靜地躺著,像睡著了一般方面。 火紅的嫁衣襯著肌膚如雪放钦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天恭金,我揣著相機(jī)與錄音操禀,去河邊找鬼。 笑死横腿,一個(gè)胖子當(dāng)著我的面吹牛颓屑,可吹牛的內(nèi)容都是我干的斤寂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揪惦,長吁一口氣:“原來是場噩夢啊……” “哼遍搞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起器腋,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤溪猿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纫塌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诊县,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年措左,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了依痊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡媳荒,死狀恐怖抗悍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钳枕,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布赏壹,位于F島的核電站鱼炒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蝌借。R本人自食惡果不足惜昔瞧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菩佑。 院中可真熱鬧自晰,春花似錦、人聲如沸稍坯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞧哟。三九已至混巧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間勤揩,已是汗流浹背咧党。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陨亡,地道東北人傍衡。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓深员,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛙埂。 傳聞我的和親對象是個(gè)殘疾皇子倦畅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言簡介 生產(chǎn)者和消費(fèi)者問題是線程模型中的經(jīng)典問題:生產(chǎn)者和消費(fèi)者在同一時(shí)間段內(nèi)共用同一個(gè)存儲(chǔ)空間,生產(chǎn)者往存儲(chǔ)空...
    水花一現(xiàn)閱讀 20,888評論 1 10
  • 志梳理下箱残,生產(chǎn)者消費(fèi)者模式 簡單的模型 先從一個(gè)例子開始吧滔迈,有一些角色我先聲明如下: 餐廳(Restaurant)...
    Armstrong_Q閱讀 593評論 0 1
  • 概述 生產(chǎn)者-消費(fèi)者模型是多線程編程中的一個(gè)經(jīng)典模型,主要描述的是生產(chǎn)者和消費(fèi)者在同一時(shí)間段內(nèi)共用同一塊存儲(chǔ)空間(...
    hu1991die閱讀 1,586評論 0 3
  • Python的Queue模塊中提供了同步的被辑、線程安全的隊(duì)列類燎悍,包括FIFO(先入先出)隊(duì)列Queue,LIFO(后...
    LittlePy閱讀 514評論 0 0
  • 設(shè)計(jì)并實(shí)現(xiàn)一個(gè)進(jìn)程盼理,該進(jìn)程擁有一個(gè)生產(chǎn)者線程和一個(gè)消費(fèi)者線程谈山,它們使用N個(gè)不同的緩沖區(qū)(N為一個(gè)確定的數(shù)值,例如N...
    云勺閱讀 5,994評論 0 4