亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【全棧之路】JAVA基礎(chǔ)課程四_生產(chǎn)者消費(fèi)者問題(20190614v1.1)

lemon / 649人閱讀

摘要:寄語天眼之父南仁東,心無旁騖,為崇山峻嶺間的中國天眼燃盡生命,看似一口大鍋,天眼是世界上最大最靈敏的單口徑射電望遠(yuǎn)鏡,可以接受百億光年外的電磁信號。南仁東總工程師執(zhí)著追求科學(xué)夢想的精神,將激勵一代又一代科技工作者繼續(xù)奮斗,勇攀世界科技高峰。

歡迎進(jìn)入JAVA基礎(chǔ)課程

博客地址:https://segmentfault.com/a/11...
本系列文章將主要針對JAVA一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時歸納所總結(jié),不管是剛接觸JAVA開發(fā)菜鳥還是業(yè)界資深人士,都希望對廣大同行帶來一些幫助。若有問題請及時留言或加QQ:243042162。

寄語:
“天眼”之父南仁東,心無旁騖,為崇山峻嶺間的中國“天眼”燃盡生命,看似一口“大鍋”,天眼是世界上最大、最靈敏的單口徑射電望遠(yuǎn)鏡,可以接受百億光年外的電磁信號。南仁東總工程師執(zhí)著追求科學(xué)夢想的精神,將激勵一代又一代科技工作者繼續(xù)奮斗,勇攀世界科技高峰。作為IT界的從業(yè)者,我們需要緊跟時代的步伐,踏過平庸,一生為科技筑夢。
生產(chǎn)者消費(fèi)者問題

1. 背景

生產(chǎn)者消費(fèi)者問題(Producer-consumer problem),也稱有限緩沖問題(Bounded-buffer problem),是一個多線程同步問題的經(jīng)典案例。生產(chǎn)者生成一定量的數(shù)據(jù)放到緩沖區(qū)中,然后重復(fù)此過程;與此同時,消費(fèi)者也在緩沖區(qū)消耗這些數(shù)據(jù)。生產(chǎn)者和消費(fèi)者之間必須保持同步,要保證生產(chǎn)者不會在緩沖區(qū)滿時放入數(shù)據(jù),消費(fèi)者也不會在緩沖區(qū)空時消耗數(shù)據(jù)。不夠完善的解決方法容易出現(xiàn)死鎖的情況,此時進(jìn)程都在等待喚醒。

2. 條件

生產(chǎn)者僅僅在倉儲未滿時候生產(chǎn), 倉滿則停止生產(chǎn).

生產(chǎn)者在生產(chǎn)出可消費(fèi)產(chǎn)品時候, 應(yīng)該通知等待的消費(fèi)者去消費(fèi).

消費(fèi)者僅僅在倉儲有產(chǎn)品時候才能消費(fèi), 倉空則等待.

消費(fèi)者發(fā)現(xiàn)倉儲沒產(chǎn)品可消費(fèi)時候會通知生產(chǎn)者生產(chǎn).

3.實現(xiàn)方式

wait() / notify()方法

await() / signal()方法

BlockingQueue阻塞隊列方法

Semaphore方法

PipedInputStream / PipedOutputStream

下面主要針對前面三種方式做代碼實現(xiàn)

(1) wait() / notify()方法

public class ProducerMain {

    private static Integer count=0;
    private final Integer full=10;
    private static String LOCK="LOCK";

    class  Producer implements Runnable{

        @Override
        public void run() {
//            for(int i=0;i<10;i++){
//                try {
//                    Thread.sleep(3000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
            synchronized (LOCK){
                while(count==full){
                    try {
                        LOCK.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
                count++;
                System.out.println(Thread.currentThread().getName()+"生產(chǎn)者生產(chǎn),目前共生產(chǎn)了:"+count);
                LOCK.notifyAll();
            }
        }
    }
    class Consumer implements Runnable{

        @Override
        public void run() {
            synchronized (LOCK){
                while (count==0){
                    try {
                        LOCK.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                count--;
                System.out.println(Thread.currentThread().getName()+"生產(chǎn)者消費(fèi),目前共剩余:"+count);
                LOCK.notifyAll();
            }
        }
    }

    public static void main(String[] args) {
        ProducerMain producer = new ProducerMain();
        new Thread(producer.new Producer()).start();
        new Thread(producer.new Consumer()).start();
        new Thread(producer.new Producer()).start();
        new Thread(producer.new Consumer()).start();
        new Thread(producer.new Producer()).start();
        new Thread(producer.new Consumer()).start();
        new Thread(producer.new Producer()).start();
        new Thread(producer.new Consumer()).start();
    }
}

輸出結(jié)果

Thread-0生產(chǎn)者生產(chǎn),目前共生產(chǎn)了:1
Thread-5生產(chǎn)者消費(fèi),目前共剩余:0
Thread-2生產(chǎn)者生產(chǎn),目前共生產(chǎn)了:1
Thread-7生產(chǎn)者消費(fèi),目前共剩余:0
Thread-6生產(chǎn)者生產(chǎn),目前共生產(chǎn)了:1
Thread-1生產(chǎn)者消費(fèi),目前共剩余:0
Thread-4生產(chǎn)者生產(chǎn),目前共生產(chǎn)了:1
Thread-3生產(chǎn)者消費(fèi),目前共剩余:0

(2)await() / signal()方法

public class ReentrantLockDemo {
    private static Integer count = 0;
    private final Integer FULL = 10;
    final Lock lock = new ReentrantLock();
    final Condition NotFull = lock.newCondition();
    final Condition NotEmpty = lock.newCondition();

    class Producer implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(3000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                lock.lock();
                try {
                    while (count == FULL) {
                        try {
                            NotFull.await();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    count++;
                    System.out.println(Thread.currentThread().getName()
                            + "生產(chǎn)者生產(chǎn),目前總共有" + count);
                    NotEmpty.signal();
                } finally {
                    lock.unlock();
                }

            }
        }
    }

    class Consumer implements Runnable {

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                lock.lock();
                try {
                    while (count == 0) {
                        try {
                            NotEmpty.await();
                        } catch (Exception e) {
                            // TODO: handle exception
                            e.printStackTrace();
                        }
                    }
                    count--;
                    System.out.println(Thread.currentThread().getName()
                            + "消費(fèi)者消費(fèi),目前總共有" + count);
                    NotFull.signal();
                } finally {
                    lock.unlock();
                }

            }

        }

    }

    public static void main(String[] args) throws Exception {
        ReentrantLockDemo hosee = new ReentrantLockDemo();
        new Thread(hosee.new Producer()).start();
        new Thread(hosee.new Consumer()).start();
        new Thread(hosee.new Producer()).start();
        new Thread(hosee.new Consumer()).start();

        new Thread(hosee.new Producer()).start();
        new Thread(hosee.new Consumer()).start();
        new Thread(hosee.new Producer()).start();
        new Thread(hosee.new Consumer()).start();
    }
}

輸出結(jié)果

Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-2生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-7消費(fèi)者消費(fèi),目前總共有0
Thread-6生產(chǎn)者生產(chǎn),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-2生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-6生產(chǎn)者生產(chǎn),目前總共有2
Thread-7消費(fèi)者消費(fèi),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-2生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-7消費(fèi)者消費(fèi),目前總共有0
Thread-6生產(chǎn)者生產(chǎn),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-2生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-7消費(fèi)者消費(fèi),目前總共有0
Thread-6生產(chǎn)者生產(chǎn),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-2生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-6生產(chǎn)者生產(chǎn),目前總共有2
Thread-7消費(fèi)者消費(fèi),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-0生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-7消費(fèi)者消費(fèi),目前總共有0
Thread-6生產(chǎn)者生產(chǎn),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-0生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-6生產(chǎn)者生產(chǎn),目前總共有2
Thread-7消費(fèi)者消費(fèi),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-0生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-6生產(chǎn)者生產(chǎn),目前總共有2
Thread-7消費(fèi)者消費(fèi),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-0生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-6生產(chǎn)者生產(chǎn),目前總共有2
Thread-7消費(fèi)者消費(fèi),目前總共有1
Thread-4生產(chǎn)者生產(chǎn),目前總共有2
Thread-5消費(fèi)者消費(fèi),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-2生產(chǎn)者生產(chǎn),目前總共有2
Thread-1消費(fèi)者消費(fèi),目前總共有1
Thread-6生產(chǎn)者生產(chǎn),目前總共有2
Thread-7消費(fèi)者消費(fèi),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0

(3)BlockingQueue阻塞隊列方法

public class BlockingQueueMain {
    private static Integer count = 0;
    final BlockingQueue bq = new ArrayBlockingQueue(10);
    class Producer implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(3000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    bq.put(1);
                    count++;
                    System.out.println(Thread.currentThread().getName()
                            + "生產(chǎn)者生產(chǎn),目前總共有" + count);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    class Consumer implements Runnable {

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                try {
                    bq.take();
                    count--;
                    System.out.println(Thread.currentThread().getName()
                            + "消費(fèi)者消費(fèi),目前總共有" + count);
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
            }
        }

    }

    public static void main(String[] args) throws Exception {
        BlockingQueueMain hosee = new BlockingQueueMain();
        new Thread(hosee.new Producer()).start();
        new Thread(hosee.new Consumer()).start();
        new Thread(hosee.new Producer()).start();
        new Thread(hosee.new Consumer()).start();

        new Thread(hosee.new Producer()).start();
        new Thread(hosee.new Consumer()).start();
        new Thread(hosee.new Producer()).start();
        new Thread(hosee.new Consumer()).start();
    }
}

輸出結(jié)果

Thread-1消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-0生產(chǎn)者生產(chǎn),目前總共有0
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-6生產(chǎn)者生產(chǎn),目前總共有1
Thread-7消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-1消費(fèi)者消費(fèi),目前總共有0
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-6生產(chǎn)者生產(chǎn),目前總共有0
Thread-7消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有0
Thread-1消費(fèi)者消費(fèi),目前總共有0
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-6生產(chǎn)者生產(chǎn),目前總共有1
Thread-7消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有1
Thread-1消費(fèi)者消費(fèi),目前總共有0
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-5消費(fèi)者消費(fèi),目前總共有0
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-6生產(chǎn)者生產(chǎn),目前總共有1
Thread-7消費(fèi)者消費(fèi),目前總共有0
Thread-4生產(chǎn)者生產(chǎn),目前總共有2
Thread-0生產(chǎn)者生產(chǎn),目前總共有1
Thread-1消費(fèi)者消費(fèi),目前總共有0
Thread-5消費(fèi)者消費(fèi),目前總共有1
Thread-2生產(chǎn)者生產(chǎn),目前總共有1
Thread-3消費(fèi)者消費(fèi),目前總共有0
Thread-6生產(chǎn)者生產(chǎn),目前總共有1
Thread-7消費(fèi)者消費(fèi),目前總共有0

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

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

相關(guān)文章

  • 全棧之路JAVA基礎(chǔ)課程_產(chǎn)者費(fèi)者問題20190614v1.1

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

    everfight 評論0 收藏0
  • 全棧之路JAVA基礎(chǔ)課程_哲學(xué)家就餐問題20190614v1.2)

    摘要:歡迎進(jìn)入基礎(chǔ)課程博客地址本系列文章將主要針對一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時歸納所總結(jié),不管是剛接觸開發(fā)菜鳥還是業(yè)界資深人士,都希望對廣大同行帶來一些幫助。若有問題請及時留言或加。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時歸納所總結(jié),不管是剛接觸JAVA開發(fā)菜鳥還是業(yè)界...

    Mr_houzi 評論0 收藏0
  • 全棧之路JAVA基礎(chǔ)課程_哲學(xué)家就餐問題20190614v1.2)

    摘要:歡迎進(jìn)入基礎(chǔ)課程博客地址本系列文章將主要針對一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時歸納所總結(jié),不管是剛接觸開發(fā)菜鳥還是業(yè)界資深人士,都希望對廣大同行帶來一些幫助。若有問題請及時留言或加。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎(chǔ)知識點(diǎn)進(jìn)行講解,為平時歸納所總結(jié),不管是剛接觸JAVA開發(fā)菜鳥還是業(yè)界...

    JerryZou 評論0 收藏0
  • 全棧之路JAVA基礎(chǔ)課程_多線程和死鎖(20190614v1.0)

    摘要:一個進(jìn)程可以有多個線程。線程又叫做輕量級進(jìn)程。這樣兩個進(jìn)程相互無休止地等待下去,均無法繼續(xù)執(zhí)行,此時兩個進(jìn)程陷入死鎖狀態(tài)。不剝奪條件進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強(qiáng)行奪走,即只能由獲得該資源的進(jìn)程自己來釋放只能是主動釋放。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎(chǔ)知識點(diǎn)進(jìn)...

    Allen 評論0 收藏0
  • 全棧之路JAVA基礎(chǔ)課程_多線程和死鎖(20190614v1.0)

    摘要:一個進(jìn)程可以有多個線程。線程又叫做輕量級進(jìn)程。這樣兩個進(jìn)程相互無休止地等待下去,均無法繼續(xù)執(zhí)行,此時兩個進(jìn)程陷入死鎖狀態(tài)。不剝奪條件進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強(qiáng)行奪走,即只能由獲得該資源的進(jìn)程自己來釋放只能是主動釋放。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對JAVA一些基礎(chǔ)知識點(diǎn)進(jìn)...

    warnerwu 評論0 收藏0

發(fā)表評論

0條評論

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