Java 线程的通讯--生产者和消费者
- package 生产者和消费者;
- //消费者
- public class Customer implements Runnable {
- private Share_resources rescources=null;
- public Customer( Share_resources rescources){
- this.rescources=rescources;
- }
- public void run() {
- for (int i = 0; i <50; i++) {
- rescources.popup();
- }
- }
- }
- package 生产者和消费者;
- //生产者
- public class Producer implements Runnable{
- private Share_resources rescources=null;
- public Producer( Share_resources rescources){
- this.rescources=rescources;
- }
- //共享资源对象
- public void run() {
- for (int i = 0; i <50; i++) {
- if(i%2==0){
- rescources.push("张三", "男");
- }else{
- rescources.push("小花", "女");
- }
- }
- }
- }
- package 生产者和消费者;
- //共享资源对象(姓名,性别)
- public class Share_resources {
- private String name;
- private String gender;
- private Boolean isEmpty=true;//表示共享资源是否为空状态
- /**
- * 生产者向共享资源对象存储数据
- * @param name 存储的姓名
- * @param gender 存储的性别
- */
- synchronized public void push(String name,String gender){
- while( ! isEmpty){//当前isEmpty为false的时候,不空等着消费者来获取
- try {
- this.wait();//使用同步锁调用,表示当前线程释放同步锁,进入等待池,只能被其他线程唤醒
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- //生产开始-----------------------------
- this.name=name;
- this.gender=gender;
- //生产结束-----------------------------
- isEmpty=false;//设置共享资源不能为空
- this.notify();//唤醒一个消费者
- }
- /**
- * 消费者从共享资源中取出数据
- */
- synchronized public void popup(){
- try {
- while( isEmpty){//当前isEmpty为true的时候,不空等着生产者来生产
- this.wait();
- }
- //消费开始------------------------------------
- Thread.sleep(10);
- System.out.println(this.name+"---"+this.gender);
- //消费结束-------------------------------------
- isEmpty=true;
- this.notify();//唤醒生产者
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- package 生产者和消费者;
- public class App {
- public static void main(String[] args) {
- //创建生产者和消费者共同的对象
- Share_resources resources =new Share_resources();
- //启动生产者线程
- new Thread(new Producer(resources)).start();
- //启动消费者线程
- new Thread(new Customer(resources)).start();
- }
- }
Java5生产者和消费者模式同步锁机制
- package java5_同步锁机制;
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- //共享资源对象(姓名,性别)
- public class Share_resources {
- private String name;
- private String gender;
- private Boolean isEmpty=true;//表示共享资源是否为空状态
- private final Lock lock=new ReentrantLock();
- private Condition condition =lock.newCondition();
- /**
- * 生产者向共享资源对象存储数据
- * @param name 存储的姓名
- * @param gender 存储的性别
- */
- public void push(String name,String gender){
- lock.lock();//获取锁
- while( ! isEmpty){//当前isEmpty为false的时候,不空等着消费者来获
- try {
- condition.await();
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- lock.unlock();//释放锁
- }
- }
- //生产开始-----------------------------
- this.name=name;
- this.gender=gender;
- //生产结束-----------------------------
- isEmpty=false;//设置共享资源不能为空
- condition.signal();//唤醒一个消费者
- }
- /**
- * 消费者从共享资源中取出数据
- */
- public void popup(){
- lock.lock();//获取锁
- try {
- while( isEmpty){//当前isEmpty为true的时候,不空等着生产者来生产
- condition.await();
- }
- //消费开始------------------------------------
- Thread.sleep(10);
- System.out.println(this.name+"---"+this.gender);
- //消费结束-------------------------------------
- isEmpty=true;
- condition.signal();//唤醒生产者
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- lock.unlock();//释放锁
- }
- }
- }
Java 线程的通讯--生产者和消费者的更多相关文章
- JAVA线程通信之生产者与消费者
package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.lo ...
- java 线程并发(生产者、消费者模式)
线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...
- Java 线程间通讯(共享变量方式)
Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...
- Java线程间通信--生产者消费者
class ProducerConsumerDemo { public static void main(String[] args) { Resource r = new ...
- JMM之Java线程间通讯——等待通知机制及其经典范式
在并发编程中,实际处理涉及两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息.在共享内存的并发模型里,线程之间共享程序的公共状 ...
- 线程操作案例--生产者与消费者,Object类对线程的支持
本章目标 1)加深对线程同步的理解 2)了解Object类中对线程的支持方法. 实例 生产者不断生产,消费者不断消费产品. 生产者生产信息后将其放到一个区域中,之后消费者从区域中取出数据. 既然生产的 ...
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒: Object类中提供了三个方法: wait():等待 notify():唤醒单个线程 notify ...
- Java并发编程(4)--生产者与消费者模式介绍
一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...
- 多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)
一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing ...
随机推荐
- Goclipse on Eclipse
Goclipse插件安装地址 https://goclipse.github.io/releases gocode.godef都可以通过Download快速安装 但guru容易失败:package g ...
- 将java程序打包成exe文件
一. 1. 项目右击,导出 jar文件 2. 下一步,选择 3. 完成 二. 1. 下载exe4j,并破解 2. 其他的步骤都好说,我主说这个步骤,一定要讲所有引用的jar包放到里面否则会报找不到文件 ...
- linux用rdate命令实现同步时间
用rdate命令实现同步时间 前两天说到用ntp时间服务器和ntpdate命令同步时间,今天简单记录下用rdate同步时间 http://blog.csdn.net/wyzxg/archive/201 ...
- spring mvc 返回字符串带双引号及StringHttpMessageConverter乱码处理
本文转载自:http://blog.csdn.net/wangyangbto/article/details/48804155 很多人都碰到过,SpringMVC使用 @ResponseBody 注解 ...
- 【转】使用Jmeter针对ActiveMQ JMS Point To Point压力测试
准备工作 针对JMS类型的Sampler,需要额外的jar包(这里用的是apache ActiveMQ,将下载的AMQ apache-activemq-5.5.0根目录下的activemq-all-5 ...
- MyBatis 工具 pndao - 自动写 SQL
pndao的原理并不复杂,是基于MyBatis的方法命名约定来生成SQL,并且写入MyBatis需要的XML. 写之前会判断是否已经存在XML或者注解,如果已经存在则略过此方法,所以无论是注解还是XM ...
- Flask之数据库迁徙
4.3 数据库迁移 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把 ...
- openstack 租户ip 手动配置 openstack静态租户ip
作者:[吴业亮]云计算开发工程师 博客:http://blog.csdn.net/wylfengyujiancheng 1.综述: 在日常开发和生产环境中经常需要将OpenStack虚拟机配置一个静态 ...
- dubbo学习 三 dubbox概述
当当网根据自身的需求,对dubbo进行了扩展就叫成了dubbox.具体的使用方法可以参照官网各种例子:http://dangdangdotcom.github.io/dubbox/ 支持rest风 ...
- Python函数的进阶
一 函数的动态参数 *agrs 位置参数动态传参 *args 接收多个位置参数 def func(*args): print(args) func("女儿国","西 ...