Java 多线程-生产者、消费者
生活随笔
收集整理的這篇文章主要介紹了
Java 多线程-生产者、消费者
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、整體代碼
? ? ? ? ThreadDemo.java
?
public class ThreadDemo { public static void main(String[] args) { Godown godown = new Godown(0); Consumer c1 = new Consumer(50, godown); Consumer c2 = new Consumer(20, godown); Consumer c3 = new Consumer(30, godown); Producer p1 = new Producer(10, godown); Producer p2 = new Producer(10, godown); Producer p3 = new Producer(10, godown); Producer p4 = new Producer(10, godown); Producer p5 = new Producer(10, godown); Producer p6 = new Producer(10, godown); Producer p7 = new Producer(80, godown); c1.start(); c2.start(); c3.start(); p1.start(); p2.start(); p3.start(); p4.start(); p5.start(); p6.start(); p7.start(); } } /** * 倉庫 */ class Godown { public static final int max_size = 100; //最大庫存量 public int curnum; //當(dāng)前庫存量 Godown() { } Godown(int curnum) { this.curnum = curnum; } /** * 生產(chǎn)指定數(shù)量的產(chǎn)品 * * @param neednum */ public synchronized void produce(int neednum) { //測(cè)試是否需要生產(chǎn) while (neednum + curnum > max_size) { System.out.println("要生產(chǎn)的產(chǎn)品數(shù)量" + neednum + "超過剩余庫存量" + (max_size - curnum) + ",暫時(shí)不能執(zhí)行生產(chǎn)任務(wù)!"); try { //當(dāng)前的生產(chǎn)線程等待 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //滿足生產(chǎn)條件,則進(jìn)行生產(chǎn),這里簡(jiǎn)單的更改當(dāng)前庫存量 curnum += neednum; System.out.println("已經(jīng)生產(chǎn)了" + neednum + "個(gè)產(chǎn)品,現(xiàn)倉儲(chǔ)量為" + curnum); //喚醒在此對(duì)象監(jiān)視器上等待的所有線程 notifyAll(); } /** * 消費(fèi)指定數(shù)量的產(chǎn)品 * * @param neednum */ public synchronized void consume(int neednum) { //測(cè)試是否可消費(fèi) while (curnum < neednum) { try { //當(dāng)前的生產(chǎn)線程等待 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //滿足消費(fèi)條件,則進(jìn)行消費(fèi),這里簡(jiǎn)單的更改當(dāng)前庫存量 curnum -= neednum; System.out.println("已經(jīng)消費(fèi)了" + neednum + "個(gè)產(chǎn)品,現(xiàn)倉儲(chǔ)量為" + curnum); //喚醒在此對(duì)象監(jiān)視器上等待的所有線程 notifyAll(); } } /** * 生產(chǎn)者 */ class Producer extends Thread { private int neednum; //生產(chǎn)產(chǎn)品的數(shù)量 private Godown godown; //倉庫 Producer(int neednum, Godown godown) { this.neednum = neednum; this.godown = godown; } public void run() { //生產(chǎn)指定數(shù)量的產(chǎn)品 godown.produce(neednum); } } /** * 消費(fèi)者 */ class Consumer extends Thread { private int neednum; //生產(chǎn)產(chǎn)品的數(shù)量 private Godown godown; //倉庫 Consumer(int neednum, Godown godown) { this.neednum = neednum; this.godown = godown; } public void run() { //消費(fèi)指定數(shù)量的產(chǎn)品 godown.consume(neednum); } }?
?
二、解釋
? ? ? ??
?
轉(zhuǎn)載于:https://www.cnblogs.com/james1207/p/3297370.html
總結(jié)
以上是生活随笔為你收集整理的Java 多线程-生产者、消费者的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ❤️520要来啦,快去给心仪的她写表白代
- 下一篇: linux网络收包过程