生产者与消费者--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 ...
随机推荐
- 未能将网站配置为使用ASP.NET4.X 解决方法
WIN 10系统安装Visual Studio 2012新建ASP.NET MVC 4 WEB 应用程序出错 有些图片是网上截取而来,之前光顾着处理问题而忘记截图了,提示的ASP.net 版本有些不同 ...
- java 发送http 的get|post 请求
<div> package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import jav ...
- QT paintevent 事件, update()槽函数
一界面重载函数 使用方法: 1在头文件里定义函数 protected: void paintEvent(QPaintEvent *event); 2 在CPP内直接重载 void ---------- ...
- 0.00-050613_zc
1. ROM bios --> 启动盘第一个扇区(此处内容为boot) 加载到 内存位置0x7C00(31KB) --> 执行权转移(也就相当于跳转) boot程序主要功能:把 软盘/映像 ...
- 使用struts碰到的错误
这种错误更有可能url中路径写错了. 而这种情况更有可能使struts.xml写错了.特别要注意action的属性值class的编写是否正确.
- Difference between menu item types; Display, Output and Action in Dynamics Ax
Difference between menu item types; Display, Output and Action in Dynamics Ax Developers often ask m ...
- C++中int转string与string转int
#include "stdafx.h" #include "string" #include "iostream" #include &qu ...
- web自动化:前端页面组成
一.web页面的组成 1. 常用:HTML + CSS + Javascript 2. HTML:定义页面的呈现内容 3. CSS:Cascading Style Sheets,层叠样式表 控制你的网 ...
- (链接)xcode7,ios9 部分兼容设置
xcode7,ios9 部分兼容设置 http://www.cnblogs.com/loganv/p/4647833.html
- 制作导航菜单分隔线的总结:用css3
经过百度统计中国中使用谷歌浏览器比较多,我很奇怪,我身边的同事很少用谷歌,唯一我用谷歌的原因就是看上它调试能力和模拟手机. 下面是我个人制作的 预览用谷歌浏览器. <!doctype html& ...