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 线程的通讯--生产者和消费者的更多相关文章

  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. selenium - 截取页面图片和截取某个元素的图

    1.截取页面图片并保存 在测试过程中,是有必要截图,特别是遇到错误的时候进行截图. # coding:utf-8 from time import sleep from PIL import Imag ...

  2. 三种实现Ajax的方式

    本文主要是比较三种实现Ajax的方式 1. prototype.js 2. jquery1.3.2.min.js 3. json2.js Java代码 收藏代码 后台处理程序(Servlet),访问路 ...

  3. Hibernate问题集锦: 概述

    Hibernate问题集锦: 概述   ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.怎么配置hibernate? ...

  4. Volley请求图片

    ImageRequest imageRequest = new ImageRequest(Config.USER_ASSETS_URL + md5(userid) + "/images/av ...

  5. maven help:system

    lifecycle:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html bindings:ht ...

  6. 蓝桥杯 算法训练 ALGO-34 纪念品分组

    算法训练 纪念品分组   时间限制:1.0s   内存限制:256.0MB 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购 ...

  7. Oracle 索引扫描的几种情况

    index range scan(索引范围扫描): 1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行i ...

  8. SE新手游操控创新:一个按键=五个技能

    转自:http://www.gamelook.com.cn/2015/01/201299 GameLook报道 / 日本游戏厂商一向擅长搞发明创造,除了诞生了各种烧脑奇葩游戏以外,日本主流手机游戏的核 ...

  9. 在VS13上编译通过的代码放在12上编译-错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW

    在VS13上编译通过的代码放在12上编译 遇到错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW 1>------ 已启动 ...

  10. Make Cents

    Every year, an elephant qualifies to the Arab Collegiate Programming Competition. He graduated this ...