博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生产者消费者模式java代码实现和理解
阅读量:3732 次
发布时间:2019-05-22

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

package com.test;/** * 生产者-消费者,使用java代码实现效果 * 定义:生产者(Producer)生产商品给仓库(Warehouse),消费者(Consumer)消费商品,仓库最多放20个商品 * 1、存在共享数据,商品的数量(线程同步) * 2、生产者和消费者之前的通信(线程通信) * @author CCQ * */public class ProducerAndConsumer {	public static void main(String[] args) {		Warehouse warehouse = new Warehouse();		Producer p1 = new Producer(warehouse);		Consumer c1 = new Consumer(warehouse);				Thread pt1 = new Thread(p1);		pt1.setName("生产者1");		Thread pt2 = new Thread(p1);		pt2.setName("生产者2");		Thread ct1 = new Thread(c1);		ct1.setName("消费者1");				pt1.start();		pt2.start();		ct1.start();	}}// 生产者class Producer implements Runnable{		Warehouse warehouse;		public Producer(Warehouse warehouse) {		this.warehouse = warehouse;	}	@Override	public void run() {		// 生产者在不停的生产商品		while(true) {			try {				Thread.sleep(100);			} catch (InterruptedException e) {				e.printStackTrace();			}			warehouse.add();		}	}}// 消费者class Consumer implements Runnable{		Warehouse warehouse;		public Consumer(Warehouse warehouse) {		this.warehouse = warehouse;	}		@Override	public void run() {		// 消费者在不同消费商品		while(true) {			try {				Thread.sleep(100);			} catch (InterruptedException e) {				e.printStackTrace();			}			warehouse.reduce();		}	}}// 仓库class Warehouse{	private int product;		// 添加商品方法 原子操作 P	public synchronized void add() {		if(product >= 20) {			try {				wait();//释放cpu资源,进入等待状态			} catch (InterruptedException e) {				e.printStackTrace();			}		}else {			product++;			System.out.println(Thread.currentThread().getName()+ "生产了第" + product + "个商品");			notifyAll();//唤醒所有的等待的线程		}	}		// 减少商品方法 原子操作 V	public synchronized void reduce(){		if(product <= 0) {			try {				wait();			} catch (InterruptedException e) {				e.printStackTrace();			}		}else {			System.out.println(Thread.currentThread().getName()+ "消费了第" + product + "个商品");			product--;			notifyAll();		}	}}

转载地址:http://mgzin.baihongyu.com/

你可能感兴趣的文章
flink state TTL(Time To Live) 如何应对飞速增长的状态?checkpoint机制原理?
查看>>
那些年,我们一起使用过的case...when
查看>>
flink之内存分配与内存管理
查看>>
一篇由flink akka timeoutException引发的slot和parallelism
查看>>
flink批量(batch)写入mysql/oracle
查看>>
基于flink broadcast实现目标用户的智能筛选
查看>>
Apache Hbase基本概念及Java API
查看>>
flink之Timer定时器
查看>>
C语言——指针
查看>>
Servlet中的三大作用域
查看>>
JSP的九大内置对象
查看>>
centos7.6安装ELK+springboot+vue实现ElasticSearch与mysql数据同步从入门到放弃一:安装宝塔面板
查看>>
centos7.6安装ELK+springboot+vue实现ElasticSearch与mysql数据同步从入门到放弃三:部署springboot项目
查看>>
Tomcat的安装和第一个javaweb项目的搭建
查看>>
当eclipse上面新建不了web项目
查看>>
Javaweb程序:eclipse新建一个servlet文件报错
查看>>
爬虫的效率,
查看>>
爬虫的效率和使用python爬取网页照片或视频
查看>>
python 文件操作
查看>>
MY SQL 管理数据库和表
查看>>