成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java多線程基礎(chǔ)(七)——Producer-Consumer模式

Benedict Evans / 1931人閱讀

摘要:一定義就是生產(chǎn)者消費者模式。消費者參與者從參與者獲取數(shù)據(jù),進行處理。通道參與者從參與者處接受參與者,并保管起來,并應(yīng)參與者的要求,將參與者傳送出去。為確保安全性,參與者與參與者要對訪問共享互斥。

一、定義

Producer-Consumer Pattern就是生產(chǎn)者-消費者模式。
生產(chǎn)者和消費者在為不同的處理線程,生產(chǎn)者必須將數(shù)據(jù)安全地交給消費者,消費者進行消費時,如果生產(chǎn)者還沒有建立數(shù)據(jù),則消費者需要等待。
一般來說,可能存在多個生產(chǎn)者和消費者,不過也有可能生產(chǎn)者和消費者都只有一個,當雙方都只有一個時,我們也稱之為Pipe Pattern。

二、模式案例

該案例中,定義了3個角色:廚師、客人、桌子。

廚師(生產(chǎn)者)定義:

public class MakerThread extends Thread {
    private final Random random;
    private final Table table;
    private static int id = 0;     //蛋糕的流水號(所有廚師共通)
    public MakerThread(String name, Table table, long seed) {
        super(name);
        this.table = table;
        this.random = new Random(seed);
    }
    public void run() {
        try {
            while (true) {
                Thread.sleep(random.nextInt(1000));
                String cake = "[ Cake No." + nextId() + " by " + getName() + " ]";
                table.put(cake);
            }
        } catch (InterruptedException e) {
        }
    }
    private static synchronized int nextId() {
        return id++;
    }
}

客人(消費者)定義:

public class EaterThread extends Thread {
    private final Random random;
    private final Table table;
    public EaterThread(String name, Table table, long seed) {
        super(name);
        this.table = table;
        this.random = new Random(seed);
    }
    public void run() {
        try {
            while (true) {
                String cake = table.take();
                Thread.sleep(random.nextInt(1000));
            }
        } catch (InterruptedException e) {
        }
    }
}

桌子(隊列)定義:

public class Table {
    private final String[] buffer;
    private int tail;
    private int head;
    private int count;
?
    public Table(int count) {
        this.buffer = new String[count];
        this.head = 0;
        this.tail = 0;
        this.count = 0;
    }
    public synchronized void put(String cake) throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " puts " + cake);
        while (count >= buffer.length) {
            wait();
        }
        buffer[tail] = cake;
        tail = (tail + 1) % buffer.length;
        count++;
        notifyAll();
    }
    public synchronized String take() throws InterruptedException {
        while (count <= 0) {
            wait();
        }
        String cake = buffer[head];
        head = (head + 1) % buffer.length;
        count--;
        notifyAll();
        System.out.println(Thread.currentThread().getName() + " takes " + cake);
        return cake;
    }
}

執(zhí)行:

public class Main {
    public static void main(String[] args) {
        Table table = new Table(3);
        new MakerThread("MakerThread-1", table, 31415).start();
        new MakerThread("MakerThread-2", table, 92653).start();
        new MakerThread("MakerThread-3", table, 58979).start();
        new EaterThread("EaterThread-1", table, 32384).start();
        new EaterThread("EaterThread-2", table, 62643).start();
        new EaterThread("EaterThread-3", table, 38327).start();
    }
}
三、模式講解

Producer-Consumer模式的角色如下:

Data(數(shù)據(jù))參與者

Data代表了實際生產(chǎn)或消費的數(shù)據(jù)。

Producer(生產(chǎn)者)參與者

Producer會創(chuàng)建Data,然后傳遞給Channel參與者。

Consumer(消費者)參與者

Consumer從Channel參與者獲取Data數(shù)據(jù),進行處理。

Channel(通道)參與者

Channel從Producer參與者處接受Data參與者,并保管起來,并應(yīng)Consumer參與者的要求,將Data參與者傳送出去。為確保安全性,Producer參與者與Consumer參與者要對訪問共享互斥。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71514.html

相關(guān)文章

  • Java線程進階(三一)—— J.U.C之collections框架:BlockingQueue接

    摘要:和方法會一直阻塞調(diào)用線程,直到線程被中斷或隊列狀態(tài)可用和方法會限時阻塞調(diào)用線程,直到超時或線程被中斷或隊列狀態(tài)可用。 showImg(https://segmentfault.com/img/bVbgyPy?w=1191&h=670); 本文首發(fā)于一世流云專欄:https://segmentfault.com/blog... 一、引言 從本節(jié)開始,我們將介紹juc-collectio...

    entner 評論0 收藏0
  • 億級高并發(fā)系統(tǒng)的監(jiān)控與報警

    摘要:個巡個推系統(tǒng)監(jiān)控隨著個推業(yè)務(wù)的不斷擴展,用戶量不斷的增加,個推急需一套完整的監(jiān)控系統(tǒng)來實時保證系統(tǒng)和業(yè)務(wù)的正常運轉(zhuǎn)。系統(tǒng)難點與設(shè)計多元化的數(shù)據(jù)基于推送業(yè)務(wù),個推擴展出許多獨立運行的系統(tǒng),而且每個系統(tǒng)的監(jiān)控數(shù)據(jù)也不一樣。 什么是系統(tǒng)監(jiān)控對于功能簡單,用戶量較少的軟件系統(tǒng),大部分公司不需要額外的監(jiān)控系統(tǒng)來保證公司業(yè)務(wù)的正常運行。而當公司發(fā)展到一定程度,系統(tǒng)越來越多元化,單一系統(tǒng)也越來越復(fù)雜...

    lovXin 評論0 收藏0
  • 【全棧之路】JAVA基礎(chǔ)課程四_生產(chǎn)者消費者問題(20190614v1.1)

    摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠鏡,可以接受百億光年外的電磁信號。南仁東總工程師執(zhí)著追求科學夢想的精神,將激勵一代又一代科技工作者繼續(xù)奮斗,勇攀世界科技高峰。 歡迎進入JAVA基礎(chǔ)課程 博客地址:https://segmentfault.com/a/11...本系列文章將主要針對JAVA一些基礎(chǔ)知識點進行...

    lemon 評論0 收藏0
  • 【全棧之路】JAVA基礎(chǔ)課程四_生產(chǎn)者消費者問題(20190614v1.1)

    摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠鏡,可以接受百億光年外的電磁信號。南仁東總工程師執(zhí)著追求科學夢想的精神,將激勵一代又一代科技工作者繼續(xù)奮斗,勇攀世界科技高峰。 歡迎進入JAVA基礎(chǔ)課程 博客地址:https://segmentfault.com/a/11...本系列文章將主要針對JAVA一些基礎(chǔ)知識點進行...

    everfight 評論0 收藏0
  • Java學習路線總結(jié),搬磚工逆襲Java架構(gòu)師(全網(wǎng)最強)

    摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領(lǐng)導們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...

    Scorpion 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<