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. mybatis参数

    分是不是用@Param注解的这两种情况, 1,使用@Param注解,就不用理parameterType xml文档直接用 字符串的值,若是一个类,class.property 2, 不使用@Param ...

  2. (转)Android中的基类—抽取出来公共的方法

    在Android中,一般来说一个应用会存在几十个页面,并且一个应用一般也会使用一个特定的主题,其中的页面的风格也是一致的,并且页面中的动画效果.页面的切换效果等也应该保持同样的风格,那么就需要一个基类 ...

  3. etcd服务端和客户端安装

    下载地址: 服务端:http://download.csdn.net/download/wuxun1997/9841277 客户端:http://download.csdn.net/download/ ...

  4. python3之scrapy安装使用

    需要安装的包 pip install scrapy selenium 可能需要卸载重装的模块   lxml cryptography  cffi  pypiwin32 pip uninstall xx ...

  5. 【转】windows下mysql5.1忘记root密码解决方法

    步骤如下:1.停止mysql服务(以管理员身份,在cmd命令行下运行) net stop mysql D:\>net stop mysql MySQL 服务正在停止. MySQL 服务已成功停止 ...

  6. mongodb数据操作(CRUD)

    1.数据插入db.集合名.insert() 操作 > use hk switched to db hk > show collections > db.info.insert({&q ...

  7. Does Windows have a limit of 2000 threads per process?

    http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx Often I see people asking why the ...

  8. (转)Oracle 临时表用法

    本文转载自:http://www.iteye.com/topic/371390 ORACLE的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据中而互不干扰,不用担心会破坏或影响其他SE ...

  9. mysql实战优化之八:关联查询优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHE ...

  10. springboot成神之——websocket发送和请求消息

    本文介绍如何使用websocket发送和请求消息 项目目录 依赖 DemoApplication MessageModel WebConfig WebSocketConfig HttpHandshak ...