博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生产者和消费者
阅读量:5280 次
发布时间:2019-06-14

本文共 2240 字,大约阅读时间需要 7 分钟。

package demo.thread;/** *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。 *其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品  */public class ProducersAndConsumers {	public static void main(String[] args) {		Storage storage = new Storage();		Thread consumer = new Thread(new Consumer(storage));		consumer.setName("消费者");		Thread producer = new Thread(new Producer(storage));		producer.setName("生产者");		consumer.start();		producer.start();	}}/** * 消费者 */class Consumer implements Runnable {	private Storage storage;	public Consumer(Storage storage) {		this.storage = storage;	}	@Override	public void run() {		storage.pop();	}}/** * 生产者 */class Producer implements Runnable {	private Storage storage;	public Producer(Storage storage) {		this.storage = storage;	}	@Override	public void run() {		Product product = new Product("090505105", "电话");		storage.push(product);	}}/** * 产品类 */class Product {	private String id;// 产品id	private String name;// 产品名称	public Product(String id, String name) {		this.id = id;		this.name = name;	}	@Override	public String toString() {		return "(产品ID:" + id + " 产品名称:" + name + ")";	}	public String getId() {		return id;	}	public void setId(String id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}}/** *仓库 */class Storage {	// 仓库容量为10	private Product[] products = new Product[10];	private int top = 0;	// 生产者往仓库中放入产品	public synchronized void push(Product product) {		while (top == products.length) {			try {				wait();//仓库已满,等待			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}        //把产品放入仓库		products[top++] = product;		System.out.println(Thread.currentThread().getName() + " 生产了产品"				+ product);		notifyAll();//唤醒等待线程	}	// 消费者从仓库中取出产品	public synchronized Product pop() {		while (top == 0) {			try {				wait();//仓库空,等待			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}		//从仓库中取产品		--top;		Product p = new Product(products[top].getId(), products[top].getName());		products[top] = null;		System.out.println(Thread.currentThread().getName() + " 消费了产品" + p);		notifyAll();//唤醒等待线程		return p;	}}

  

转载于:https://www.cnblogs.com/lnas01/p/5350755.html

你可能感兴趣的文章
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
MetaWeblog API Test
查看>>
移动、尺寸改变
查看>>
c# 文件笔记
查看>>
类和结构
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
线程池的概念
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
SWIFT国际资金清算系统
查看>>
站立会议第四天
查看>>