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(); }
}

  

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

  1. 线程操作案例--生产者与消费者,Object类对线程的支持

    本章目标 1)加深对线程同步的理解 2)了解Object类中对线程的支持方法. 实例 生产者不断生产,消费者不断消费产品. 生产者生产信息后将其放到一个区域中,之后消费者从区域中取出数据. 既然生产的 ...

  2. disruptor 单生产者多消费者

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

  3. 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数

    1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...

  4. LMAX Disruptor—多生产者多消费者中,消息复制分发的高性能实现

    解决的问题 当我们有多个消息的生产者线程,一个消费者线程时,他们之间如何进行高并发.线程安全的协调? 很简单,用一个队列. 当我们有多个消息的生产者线程,多个消费者线程,并且每一条消息需要被所有的消费 ...

  5. JAVA并发框架之Semaphore实现生产者与消费者模型

    分类: Java技术      锁和信号量(Semaphore)是实现多线程同步的两种常用的手段.信号量需要初始化一个许可值,许可值可以大于0,也可以小于0,也可以等于0.      如果大于0,表示 ...

  6. java 22 - 19 多线程之生产者和消费者的代码优化

    在之前,是把生产者录入数据和消费者获取数据的所有代码都分别写在各自的类中. 这样不大好 这次把生产者和消费者部分关键代码都写入资源类中: package zl_Thread; public class ...

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

    生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获 ...

  8. Java实现生产者和消费者

    生产者和消费者问题是操作系统的经典问题,在实际工作中也常会用到,主要的难点在于协调生产者和消费者,因为生产者的个数和消费者的个数不确定,而生产者的生成速度与消费者的消费速度也不一样,同时还要实现生产者 ...

  9. linux第13天 生产者与消费者

    pthread_cond_t   my_condition = PTHREAD_COND_INITIALIZER; pthread_mutex_t mutex = PTHREAD_MUTEX_INIT ...

  10. java多线程中的生产者与消费者之等待唤醒机制@Version1.0

    一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notify ...

随机推荐

  1. 字符串问题之 去掉字符串中连续出现K个0的子串

    字符串中刚好出现K个连续的‘O’,则把K个连续‘O’字符去除,返回处理后的字符串 比如 str="AOOOOOBOOO"   k=3, 返回“AOOOOOB” 这个题的解决思路也有 ...

  2. 调整JVM堆内存解决OutOfMemoryError

    今天在用 processing(http://zh.wikipedia.org/wiki/Processing) 编写处理 midi 文件的程序的时候,遇到了一个问题.程序主要是读取分析 midi , ...

  3. SoapUI使用方法-01发送http请求

    soap ui http://blog.csdn.net/russ44/article/details/51680083 一.发送HTTP请求消息 1.打开soapUI. 2.新建一个项目,实例如下: ...

  4. JavaScript -- 控制table的创建 与 删除, 排序, 表格颜色

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. JavaWeb -- 内省—beanutils工具包 的使用

    Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写. Beanu ...

  6. 并发Socket程序设计

    1. 非阻塞并发模型 直接将socket设置为非阻塞, 轮询处理连接和接收. 缺点: 极大消耗CPU资源,不适合实际应用. 2. 信号驱动模型 当Socket文件描述符准备就绪后 内核会给进程发送一个 ...

  7. spring的事物回滚

    //默认spring只能在捕获到runtimeException时才会回滚, throw new RuntimeException("出现runtime异常"); } catch ...

  8. review21

    Class是java.lang包中的类,该类的实例可以帮助程序创建其他类的实例或者取得其他类的对象的内部信息. 参考代码如下所示: package pack07; import java.util.D ...

  9. npm全局安装

    时间长了,很多东西都忘了. 全局安装以后,在你自己的电脑任何位置都可以使用的包.直接用命令使用的: 比如:supervisor mok 还有cnpm,express之类的.gulp之类的. 剩下的我们 ...

  10. c#加密,java解密(3DES加密)

    c#代码 using System; using System.Security; using System.Security.Cryptography; using System.IO; using ...