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排序

    排序的时候#和$的分别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by ...

  2. 环境无法创建目录,提示Too many links

    业务流程需要从客户端下载文件到本地临时目录,然后再解压文件写入相应文件后压缩,现在发现第一步创建本地临时目录就失败了. 去环境上用df命令一看,磁盘分区空间已用99%,还没到100%应该是没问题的.再 ...

  3. Tomcat设置欢迎页问题

    今天下载了tomat9,配置到eclipse后拉起来,想跑个欢迎页看看是否起好了,随手写了个index.jsp放到项目Struts2的WebContent根目录下,直接打开网页输入http://loc ...

  4. 第13篇 PSR-2代码样式

    这个规范原文如下: 1. Overview Code MUST follow a "coding style guide" PSR [PSR-1]. Code MUST use 4 ...

  5. 2、通过HBase API进行开发

    一.将HBase的jar包及hbase-site.xml添加到IDE 1.到安装HBase集群的任意一台机器上找到HBase的安装目录,到lib目录下下载HBase需要的jar包,然后再到conf目录 ...

  6. 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 ...

  7. java求10!的阶乘

    package com.aaa; //求10!的阶乘 public class Cheng { public static void main(String[] args) { int s=1; fo ...

  8. Netty Client 重连实现

    当我们用Netty实现一个TCP client时,我们当然希望当连接断掉的时候Netty能够自动重连.Netty Client有两种情况下需要重连: Netty Client启动的时候需要重连 在程序 ...

  9. 地下迷宫探索(dfs)

    地下迷宫探索(30 分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时 ...

  10. js作用域和作用域链

    作用域 首先要知道一点,js跟python都是一样的,先编译后执行 唯一的区别在于,js对于只声明,未定义的变量,报错是未定义,后面代码会有这个例子 编译的过程只有赋值和开辟空间的过程 只有函数,类才 ...