生产者与消费者--demo1---bai

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

//自定义类,描述仓库
public class StoreHouse
{
	private List<String> products = new ArrayList<String>(); //仓库的所有商品的列表

	public void add(String product)
	{
		this.products.add(product);
	}
	Random rd = new Random();
	public String sale()  //随机从所有商品中,任取一件进行出售
	{
		int index = rd.nextInt(this.products.size());

		//从数组中,删除序号为index的商品。并作为返回值返回。
		String product = this.products.remove(index);
		return product;
	}

	//获取仓库的商品个数
	public int getSize()
	{
		return  this.products.size();
	}
}

  

import java.util.Random;

//消费者线程。不断的消费
public class ConsumeThread extends  Thread
{
	private StoreHouse house;//持有1个仓库

	//构造函数中,传入仓库对象
	public ConsumeThread(StoreHouse house)
	{
		this.house = house;
	} 

	@Override
	public void run() {
		Random rd = new Random();
		while(true)
		{
			synchronized (house)
			{
				if(house.getSize()==0)
				{
					System.out.println("仓库为空,消费者开始等待...");
					//如果仓库为空,则本消费者线程进入等待状态。会释放同步锁。
					try {
						house.wait(); //释放同步锁,其他线程可以继续执行。
						//Thread.sleep(3000);//不释放同步锁。所以其他线程无法继续执行。
						//house.wait();
					} catch (InterruptedException e) {

						e.printStackTrace();
					}
				}
			}

			synchronized (house)
			{
				if (house.getSize() > 0) //只要仓库的库存大于0
				{
					String product = house.sale();
					System.out.println("消费者从仓库中取走了 " + product);
				}
			}
			try {
				Thread.sleep(rd.nextInt(2000));
			} catch (InterruptedException e) {

				e.printStackTrace();
			} //随机休息2秒以内的时间
		}
	}

}

  

import java.util.Random;

//生产者线程。不断的往仓库添加商品

public class ProduceThread  extends  Thread
{
	private StoreHouse house;//持有1个仓库

	//构造函数中,传入仓库对象
	public ProduceThread(StoreHouse house)
	{
		this.house = house;
	}

	@Override
	public void run()
	{
		Random rd = new Random();
		//不断的往仓库添加商品
		while(true)
		{
			synchronized (house)
			{
				//随机产生1个商品名
				String product = "商品" + rd.nextInt(200);
				//将该商品添加到仓库
				house.add(product);
				house.notifyAll();//通知所有其他处于wait状态的线程继续执行
				System.out.println("生产者将 " + product + " 添加到仓库中");
			}
			try {
				Thread.sleep(rd.nextInt(2000));
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} //随机休息2秒以内的时间
		}
	}

}

  

public class Test
{
	public static void main(String[] args)
	{
		//1 创建1个仓库对象,作为共享数据
		StoreHouse house = new StoreHouse();
		//2 创建生产者线程
		ProduceThread pt = new ProduceThread(house);

		//3 创建消费者线程
		ConsumeThread ct1 = new ConsumeThread(house);
		ConsumeThread ct2 = new ConsumeThread(house);
		//4 启动线程
		pt.start();
		ct1.start();
		ct2.start();

	}
}

  

时间: 2024-10-13 16:19:13

生产者与消费者--demo1---bai的相关文章

disruptor 单生产者多消费者

demo1 单生产者多消费者创建. maven 依赖 <!-- https://mvnrepository.com/artifact/com.lmax/disruptor --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.2</version> </dependency&

多线程操作实例——生产者与消费者

面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者——设置信息名字name,和内容content 消费者——负责取出设置的信息. 一.基本实现 由于线程的不确定性可能出现以下问题: (1)消费者取出的信息不匹配,即不是由同一个生产者设置的信息 (2)生产者生产了多个信息,消费者才开始取出信息,或消费者取出的重复的信息. 上面的问题下面会逐一解决,下面

同步函数 生产者和消费者模式 加强版(多人生产和多人消费)

曾经搞了半天, 生产者和消费者模式  加强版(多人生产 多人消费 ).. 以前的代码格式就不再吐槽了(以后努力改进) //输出结果是一个无限循环 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 多个生产者&多个消费者模式 * 多个生产者不断生产,多个消费者不停的消费

Parallel Programming-实现并行操作的流水线(生产者、消费者)

本文介绍如何使用C#实现并行执行的流水线(生产者消费者): 流水线示意图 实现并行流水线 一.流水线示意图 上图演示了流水线,action1接收input,然后产生结果保存在buffer1中,action2读取buffer1中由action1产生的数据,以此类推指导action4完成产生Output. 以上也是典型的生产者消费者模式. 上面的模式如果使用普通常规的串行执行是很简单的,按部就班按照流程图一步一步执行即可.如果为了提高效率,想使用并行执行,也就是说生产者和消费者同时并行执行,该怎么办

java多线程(同步与死锁问题,生产者与消费者问题)

首先我们来看同步与死锁问题: 所谓死锁,就是A拥有banana,B拥有apple. A对B说:你把apple给我,我就把banana给你. B对A说:你把banana给我,我就把apple给你. 但是A和B都在等待对方的答复,那么这样最终的结果就是A得不到apple,B也得不到banana.这种死循环就是死锁. 于是我们可以模拟上面的描述,写出以下代码: 类A代表A这个人, public class A { public void say(){ System.out.println("A sai

生产者与消费者问题

***********************************************声明****************************************************** 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! *******************************************

使用JUC并发工具包的Lock和Condition,实现生产者和消费者问题中的有界缓存

JDK5.0之前,用java实现生产者和消费者的唯一方式就是使用synchronized内置锁和wait/notify条件通知机制.JDK5.0之后提供了显示锁Lock和条件队列Condition,与内置锁和内置条件队列相对应,但是显示的锁和条件队列,功能更强大,更灵活.此外JDK5.0之后还提供了大量很有用的并发工具类,如BlockingQueue等,基于这些数据结构,能够方便.快速.高效的构建自己应用需要的效果.这里我们简单使用下显示锁和条件队列,来模拟有界缓存的实现,功能类似于JDK内置的

Java中的生产者、消费者问题

Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库). 其中一个是生产者, 用于将产品放入仓库: 另外一个是消费者, 用于从仓库中取出产品消费. 问题出现在当仓库已经满了, 而此时生产者还想向其中放入一个新的产品的情形, 其解决方法是让生产者此时进行等待, 等待消费者从仓库中取走了一个或者多个产品后再去唤醒它. 同样地, 当仓库已经空了, 而消费者还

java 22 - 16 多线程之生产者和消费者的问题

生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * 资源类:Student 1 public class Student { 2 3 String name; 4 int age; 5

实验四、生产者和消费者

一.    实验目的 1.掌握临界区的概念及临界区的设计原则: 2.掌握信号量的概念.PV操作的含义以及应用PV操作实现进程的同步与互斥: 3.分析进程争用资源的现象,学习解决进程互斥的方法. 二.    实验内容及要求 分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟 生产者--消费者问题表述: 有一环形缓冲池,包含n个缓冲区(0~n-1). 有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品,所有进程必须