【Java多线程】生产者消费者问题
生活随笔
收集整理的這篇文章主要介紹了
【Java多线程】生产者消费者问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用管程法
屬性定義
- 緩沖區的容量為10
- 生產者將生產100個面包
- 消費者將消費105個面包
思路
-
生產者不停地生產,生產結果放進緩沖區
消費者不停地消費,從緩沖區中取走產品 -
當緩沖區為10時,停止生產,線程阻塞
當緩沖區為0時,停止消費,線程阻塞 -
當成功生產一個后,喚醒所有線程
當成功消費一個后,喚醒所有線程
以下兩種方式運行結果相同:
方法一:同步塊
package cn.hanquan.test;/** 生產者消費者問題——管程法* 緩沖區的容量為10* 生產者將生產100個面包* 消費者將消費100個面包*/ public class ProducerConsumer {public static void main(String[] args) {Stack s = new Stack();Consumer c = new Consumer(s);Producer p = new Producer(s);c.start();p.start();} }//面包 class Bread {int num;public Bread(int num) {this.num = num;}public Bread() {} }//緩沖區 class Stack {Bread[] breads = new Bread[10];int total = 0;public void push(Bread b) {if(total==breads.length) {try {this.wait();//線程阻塞} catch (InterruptedException e) {}}breads[total] = b;try {Thread.sleep(20);//模擬延時} catch (InterruptedException e) {}total++;this.notifyAll();}public Bread pop() {if(total==0) {try {this.wait();//線程阻塞} catch (InterruptedException e) {}}total--;try {Thread.sleep(90);//模擬延時} catch (InterruptedException e) {}this.notifyAll();Bread b = new Bread();b = breads[total];return b;} }//生產者 class Producer extends Thread {Stack s;public Producer(Stack s) {this.s = s;}public void run() {for (int i = 0; i < 105; i++) {synchronized(s) {s.push(new Bread(i));}System.out.println("生產" + i);}} }//消費者 class Consumer extends Thread {Stack s;public Consumer(Stack s) {this.s = s;}public void run() {for (int i = 0; i < 100; i++) {synchronized(s) {System.out.println("消費" + s.pop().num);}}} }方法二:同步方法
package cn.hanquan.test;/** 生產者消費者問題——管程法* 緩沖區的容量為10* 生產者將生產100個面包* 消費者將消費100個面包*/ public class ProducerConsumer {public static void main(String[] args) {Stack s = new Stack();Consumer c = new Consumer(s);Producer p = new Producer(s);c.start();p.start();} }//面包 class Bread {int num;public Bread(int num) {this.num = num;}public Bread() {} }//緩沖區 class Stack {Bread[] breads = new Bread[10];int total = 0;public synchronized void push(Bread b) {if (total == breads.length) {try {this.wait();// 線程阻塞} catch (InterruptedException e) {}}breads[total] = b;try {Thread.sleep(20);// 模擬延時} catch (InterruptedException e) {}total++;this.notifyAll();}public synchronized Bread pop() {if (total == 0) {try {this.wait();// 線程阻塞} catch (InterruptedException e) {}}total--;try {Thread.sleep(90);// 模擬延時} catch (InterruptedException e) {}this.notifyAll();Bread b = new Bread();b = breads[total];return b;} }//生產者 class Producer extends Thread {Stack s;public Producer(Stack s) {this.s = s;}public void run() {for (int i = 0; i < 105; i++) {s.push(new Bread(i));System.out.println("生產" + i);}} }//消費者 class Consumer extends Thread {Stack s;public Consumer(Stack s) {this.s = s;}public void run() {for (int i = 0; i < 100; i++) {System.out.println("消費" + s.pop().num);}} }運行結果
生產0 消費0 生產1 消費1 生產2 消費2 生產3 消費3 生產4 消費4 生產5 消費5 生產6 消費6 生產7 消費7 生產8 消費8 生產9 消費9 生產10 消費10 生產11 消費11 生產12 消費12 生產13 消費13 生產14 消費14 生產15 消費15 生產16 消費16 生產17 消費17 生產18 消費18 生產19 消費19 生產20 消費20 生產21 消費21 生產22 消費22 生產23 消費23 生產24 消費24 生產25 消費25 生產26 消費26 生產27 消費27 生產28 消費28 生產29 消費29 生產30 消費30 生產31 消費31 生產32 消費32 生產33 消費33 生產34 消費34 生產35 消費35 生產36 消費36 生產37 消費37 生產38 消費38 生產39 消費39 生產40 消費40 生產41 消費41 生產42 消費42 生產43 消費43 生產44 消費44 生產45 消費45 生產46 消費46 生產47 消費47 生產48 消費48 生產49 消費49 生產50 消費50 生產51 消費51 生產52 消費52 生產53 消費53 生產54 消費54 生產55 消費55 生產56 消費56 生產57 消費57 生產58 消費58 生產59 消費59 生產60 消費60 生產61 消費61 生產62 消費62 生產63 消費63 生產64 消費64 生產65 消費65 生產66 消費66 生產67 消費67 生產68 消費68 生產69 消費69 生產70 消費70 生產71 消費71 生產72 消費72 生產73 消費73 生產74 消費74 生產75 消費75 生產76 消費76 生產77 消費77 生產78 消費78 生產79 消費79 生產80 消費80 生產81 消費81 生產82 消費82 生產83 消費83 生產84 消費84 生產85 消費85 生產86 消費86 生產87 消費87 生產88 消費88 生產89 消費89 生產90 消費90 生產91 消費91 生產92 消費92 生產93 消費93 生產94 消費94 生產95 消費95 生產96 消費96 生產97 消費97 生產98 消費98 生產99 消費99 生產100 生產101 生產102 生產103 生產104總結
以上是生活随笔為你收集整理的【Java多线程】生产者消费者问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java多线程】并发容器CopyOnW
- 下一篇: java美元兑换,(Java实现) 美元