1. package 生产者和消费者;
  2. //消费者
  3. public class Customer implements Runnable {
  4. private Share_resources rescources=null;
  5. public Customer( Share_resources rescources){
  6. this.rescources=rescources;
  7. }
  8. public void run() {
  9. for (int i = 0; i <50; i++) {
  10. rescources.popup();
  11. }
  12. }
  13.  
  14. }
  1. package 生产者和消费者;
  2. //生产者
  3. public class Producer implements Runnable{
  4. private Share_resources rescources=null;
  5. public Producer( Share_resources rescources){
  6. this.rescources=rescources;
  7. }
  8. //共享资源对象
  9. public void run() {
  10. for (int i = 0; i <50; i++) {
  11. if(i%2==0){
  12. rescources.push("张三", "男");
  13. }else{
  14. rescources.push("小花", "女");
  15. }
  16. }
  17. }
  18. }
  1. package 生产者和消费者;
  2. //共享资源对象(姓名,性别)
  3. public class Share_resources {
  4. private String name;
  5. private String gender;
  6. private Boolean isEmpty=true;//表示共享资源是否为空状态
  7. /**
  8. * 生产者向共享资源对象存储数据
  9. * @param name 存储的姓名
  10. * @param gender 存储的性别
  11. */
  12. synchronized public void push(String name,String gender){
  13. while( ! isEmpty){//当前isEmpty为false的时候,不空等着消费者来获取
  14. try {
  15. this.wait();//使用同步锁调用,表示当前线程释放同步锁,进入等待池,只能被其他线程唤醒
  16. Thread.sleep(10);
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. //生产开始-----------------------------
  22. this.name=name;
  23. this.gender=gender;
  24. //生产结束-----------------------------
  25. isEmpty=false;//设置共享资源不能为空
  26. this.notify();//唤醒一个消费者
  27. }
  28. /**
  29. * 消费者从共享资源中取出数据
  30. */
  31. synchronized public void popup(){
  32. try {
  33. while( isEmpty){//当前isEmpty为true的时候,不空等着生产者来生产
  34. this.wait();
  35. }
  36. //消费开始------------------------------------
  37. Thread.sleep(10);
  38. System.out.println(this.name+"---"+this.gender);
  39. //消费结束-------------------------------------
  40. isEmpty=true;
  41. this.notify();//唤醒生产者
  42. } catch (InterruptedException e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  1. package 生产者和消费者;
  2.  
  3. public class App {
  4. public static void main(String[] args) {
  5. //创建生产者和消费者共同的对象
  6. Share_resources resources =new Share_resources();
  7. //启动生产者线程
  8. new Thread(new Producer(resources)).start();
  9. //启动消费者线程
  10. new Thread(new Customer(resources)).start();
  11. }
  12. }

Java5生产者和消费者模式同步锁机制

  1. package java5_同步锁机制;
  2.  
  3. import java.util.concurrent.locks.Condition;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;
  6.  
  7. //共享资源对象(姓名,性别)
  8. public class Share_resources {
  9. private String name;
  10. private String gender;
  11. private Boolean isEmpty=true;//表示共享资源是否为空状态
  12. private final Lock lock=new ReentrantLock();
  13. private Condition condition =lock.newCondition();
  14. /**
  15. * 生产者向共享资源对象存储数据
  16. * @param name 存储的姓名
  17. * @param gender 存储的性别
  18. */
  19. public void push(String name,String gender){
  20. lock.lock();//获取锁
  21. while( ! isEmpty){//当前isEmpty为false的时候,不空等着消费者来获
  22. try {
  23. condition.await();
  24. Thread.sleep(10);
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }finally {
  28. lock.unlock();//释放锁
  29. }
  30. }
  31. //生产开始-----------------------------
  32. this.name=name;
  33. this.gender=gender;
  34. //生产结束-----------------------------
  35. isEmpty=false;//设置共享资源不能为空
  36. condition.signal();//唤醒一个消费者
  37. }
  38. /**
  39. * 消费者从共享资源中取出数据
  40. */
  41. public void popup(){
  42. lock.lock();//获取锁
  43. try {
  44. while( isEmpty){//当前isEmpty为true的时候,不空等着生产者来生产
  45. condition.await();
  46. }
  47. //消费开始------------------------------------
  48. Thread.sleep(10);
  49. System.out.println(this.name+"---"+this.gender);
  50. //消费结束-------------------------------------
  51. isEmpty=true;
  52. condition.signal();//唤醒生产者
  53. } catch (InterruptedException e) {
  54. // TODO Auto-generated catch block
  55. e.printStackTrace();
  56. }finally {
  57. lock.unlock();//释放锁
  58. }
  59. }
  60. }

Java 线程的通讯--生产者和消费者的更多相关文章

  1. JAVA线程通信之生产者与消费者

    package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.lo ...

  2. java 线程并发(生产者、消费者模式)

    线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...

  3. Java 线程间通讯(共享变量方式)

    Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...

  4. Java线程间通信--生产者消费者

    class ProducerConsumerDemo {    public static void main(String[] args)     {        Resource r = new ...

  5. JMM之Java线程间通讯——等待通知机制及其经典范式

    在并发编程中,实际处理涉及两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息.在共享内存的并发模型里,线程之间共享程序的公共状 ...

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

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

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

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

  8. Java并发编程(4)--生产者与消费者模式介绍

    一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...

  9. 多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)

    一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing ...

随机推荐

  1. Goclipse on Eclipse

    Goclipse插件安装地址 https://goclipse.github.io/releases gocode.godef都可以通过Download快速安装 但guru容易失败:package g ...

  2. 将java程序打包成exe文件

    一. 1. 项目右击,导出 jar文件 2. 下一步,选择 3. 完成 二. 1. 下载exe4j,并破解 2. 其他的步骤都好说,我主说这个步骤,一定要讲所有引用的jar包放到里面否则会报找不到文件 ...

  3. linux用rdate命令实现同步时间

    用rdate命令实现同步时间 前两天说到用ntp时间服务器和ntpdate命令同步时间,今天简单记录下用rdate同步时间 http://blog.csdn.net/wyzxg/archive/201 ...

  4. spring mvc 返回字符串带双引号及StringHttpMessageConverter乱码处理

    本文转载自:http://blog.csdn.net/wangyangbto/article/details/48804155 很多人都碰到过,SpringMVC使用 @ResponseBody 注解 ...

  5. 【转】使用Jmeter针对ActiveMQ JMS Point To Point压力测试

    准备工作 针对JMS类型的Sampler,需要额外的jar包(这里用的是apache ActiveMQ,将下载的AMQ apache-activemq-5.5.0根目录下的activemq-all-5 ...

  6. MyBatis 工具 pndao - 自动写 SQL

    pndao的原理并不复杂,是基于MyBatis的方法命名约定来生成SQL,并且写入MyBatis需要的XML. 写之前会判断是否已经存在XML或者注解,如果已经存在则略过此方法,所以无论是注解还是XM ...

  7. Flask之数据库迁徙

    4.3 数据库迁移 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把 ...

  8. openstack 租户ip 手动配置 openstack静态租户ip

    作者:[吴业亮]云计算开发工程师 博客:http://blog.csdn.net/wylfengyujiancheng 1.综述: 在日常开发和生产环境中经常需要将OpenStack虚拟机配置一个静态 ...

  9. dubbo学习 三 dubbox概述

    当当网根据自身的需求,对dubbo进行了扩展就叫成了dubbox.具体的使用方法可以参照官网各种例子:http://dangdangdotcom.github.io/dubbox/   支持rest风 ...

  10. Python函数的进阶

    一  函数的动态参数 *agrs  位置参数动态传参 *args  接收多个位置参数 def func(*args): print(args) func("女儿国","西 ...