生产者与消费者--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(); }
}
生产者与消费者--demo1---bai的更多相关文章
- 线程操作案例--生产者与消费者,Object类对线程的支持
本章目标 1)加深对线程同步的理解 2)了解Object类中对线程的支持方法. 实例 生产者不断生产,消费者不断消费产品. 生产者生产信息后将其放到一个区域中,之后消费者从区域中取出数据. 既然生产的 ...
- disruptor 单生产者多消费者
demo1 单生产者多消费者创建. maven 依赖 <!-- https://mvnrepository.com/artifact/com.lmax/disruptor --> < ...
- 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数
1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...
- LMAX Disruptor—多生产者多消费者中,消息复制分发的高性能实现
解决的问题 当我们有多个消息的生产者线程,一个消费者线程时,他们之间如何进行高并发.线程安全的协调? 很简单,用一个队列. 当我们有多个消息的生产者线程,多个消费者线程,并且每一条消息需要被所有的消费 ...
- JAVA并发框架之Semaphore实现生产者与消费者模型
分类: Java技术 锁和信号量(Semaphore)是实现多线程同步的两种常用的手段.信号量需要初始化一个许可值,许可值可以大于0,也可以小于0,也可以等于0. 如果大于0,表示 ...
- java 22 - 19 多线程之生产者和消费者的代码优化
在之前,是把生产者录入数据和消费者获取数据的所有代码都分别写在各自的类中. 这样不大好 这次把生产者和消费者部分关键代码都写入资源类中: package zl_Thread; public class ...
- java 22 - 16 多线程之生产者和消费者的问题
生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获 ...
- Java实现生产者和消费者
生产者和消费者问题是操作系统的经典问题,在实际工作中也常会用到,主要的难点在于协调生产者和消费者,因为生产者的个数和消费者的个数不确定,而生产者的生成速度与消费者的消费速度也不一样,同时还要实现生产者 ...
- linux第13天 生产者与消费者
pthread_cond_t my_condition = PTHREAD_COND_INITIALIZER; pthread_mutex_t mutex = PTHREAD_MUTEX_INIT ...
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒: Object类中提供了三个方法: wait():等待 notify():唤醒单个线程 notify ...
随机推荐
- 深入Spring:自定义注解加载和使用
前言 在工作中经常使用Spring的相关框架,免不了去看一下Spring的实现方法,了解一下Spring内部的处理逻辑.特别是开发Web应用时,我们会频繁的定义@Controller,@Service ...
- Elasticsearch6.0简介入门介绍
Elasticsearch简单介绍 Elasticsearch (ES)是一个基于Lucene构建的开源.分布式.RESTful 接口全文搜索引擎.Elasticsearch 还是一个分布式文档数据库 ...
- 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法……然而我太弱了,一开始只想到了矩阵乘法的 ...
- java深入探究13-js,ajax
链接:http://pan.baidu.com/s/1c2D0cAs 密码:uwm6 1.js 1)三种基本类型: var num=100; var str="哈哈"; var f ...
- JavaWeb -- 自定义标签实例, 防盗链, JSTL 核心标签
1. 自定义标签应用实例1: 防盗链 标签处理类 public class RefererTag extends SimpleTagSupport { private String site; pri ...
- Codeforces Round #372 (Div. 2) A ,B ,C 水,水,公式
A. Crazy Computer time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Tomcat的bin目录下startup.bat、Tomcat6.exe、Tomcat6w.exe区别
从官方下载了apache-tomcat-6.0.37-windows-x64.zip安装包,解压后bin目录下的startup.bat.Tomcat6.exe.Tomcat6w.exe 3个程序有何区 ...
- 安装Nodejs、npm、Less(支持生成压缩后的css)
安装Nodejs和npm 1.到https://nodejs.org/en/下载最新的版本,安装到d盘下,假设安装后的路径为D:\Program Files\nodejs, 笔者当前的版本v6.10. ...
- iostat相关参数说明——await:平均每次设备I/O操作的等待时间 (毫秒),如果%util接近 100%,说明产生的I/O请求太多
iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU使用情况.同vmstat一样, ...
- BackBone 源码解读及思考
说明 前段时间略忙,终于找到时间看看backbone代码. 正如知友们说的那样,backbone简单.随性. 代码简单的看一眼,就能知道作者的思路.因为简单,所以随性,可以很自由的和其他类库大搭配使用 ...