生产者与消费者--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 ...
随机推荐
- Luogu-4248 [AHOI2013]差异
\(\sum_{i<j}len(i)+len(j)\)比较简单,稍微想想就出来了,问题在于怎么求任意两个后缀的\(lcp\)长度之和 因为求\(lcp\)实际上就是一个对\(h\)数组求区间最小 ...
- 关于view里面xib的问题
[[[NSBundle mainBundle] loadNibNamed:@"NetFailView" owner:self options:nil] lastObject]; 会 ...
- Java properties配置文件工具类
/* * Copyright (c) 2017. Panteng.Co.Ltd All rights reserved */ import org.apache.log4j.Logger; impor ...
- java中@Qualifier("string")是什么用法
@Qualifier("XXX") Spring的Bean注入配置注解,该注解指定注入的Bean的名称,Spring框架使用byName方式寻找合格的bean,这样就消除了byTy ...
- QT QDialog如何弹出一个子窗口
1. 假设已有一个QDialog的父窗口, 想弹出的子窗口为自己实现的myDialog : QDialog. myDialog 设计和平常的QDialog一样, childDialog : publi ...
- Linux嵌入式 -- 内核 - 进程控制 和 调度
1. 进程四要素 1. 有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2. 有进程专用的内核空间堆栈. 3. 在内核中有一个task_struct数据结构,即通常所说的&q ...
- Yum 命令语法
一.Yum 命令格式: yum <options> <command><package...> 二.参数说明 1.options: 1)-y:如果在工作过程中如要使 ...
- numpy nonzero与isnan
nonzero 直接看例子: In [83]: x = np.array([[1,0,0], [0,2,0], [1,1,0]]) In [84]: x.shape Out[84]: (3L, 3L) ...
- [转]理解Object.assign
本节内容我们继续探讨关于ES2015的一些新的内容,Object.assign函数的使用,使用该函数我们可以快速的复制一个或者多个对象到目标对象中,本文内容涉及es6,es7相关的对象复制的内容,以及 ...
- Advanced SQL: Relational division in jOOQ
i Rate This Relational algebra has its treats. One of the most academic features is the ...