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. shell中的输入输出和编程中的变量(shell 03)

    shell中的输入输出标准输入:键盘标准输出:终端显示器>> 追加是换行追加的echo -n 不尾随换行符 -e 启用解释反斜杠的转义功能 -E 禁用解释反斜杠的转义功能(默认) --he ...

  2. 关于Python导入其他目录中的类

    在需要导入的某个类的目录中,添加一个__init__.py的文件,

  3. VirtualBox 虚拟机 centos7 下 设置静态ip 并支持 xshell 远程登陆的设置方法

    1.设置虚拟机使用“桥接模式” 2.使用 vi /etc/sysconfig/network-scripts/ifcfg-enp0s3  打开配置文件(其中 enp0s3 是你的linux的网卡名,在 ...

  4. 微信小程序之if操作

    .wxss控制样式 .price-agent{ font-size: 25rpx; color:#ababab; float: left; position: absolute; bottom: 0; ...

  5. 温故而知新(java实现)单例模式的七种写法

    第一种(懒汉,线程不安全): Java代码 public class Singleton { private static Singleton instance; private Singleton ...

  6. UseSubmitBehavior="false" 防止页面重复提交bug

    OnClientClick="this.disabled=true;" UseSubmitBehavior="false" 注: 1.当设置UseSubmitB ...

  7. fiddler代理hosts配置

    1 需求背景 fidder开启后,C:\Windows\System32\drivers\etc\hosts配置失效问题:fiddler本身代理hosts配置表,修改后,可以省去在手机等代理使用者的系 ...

  8. puclic 页面公共CSS样式

    body, div, dl, dt, dd, ul, ol, li, pre, form, fieldset, blockquote, h1, h2, h3, h4, h5, h6,p{ paddin ...

  9. SerialPort缓冲区

    SerialPort缓冲区中有:接收缓冲区,发送缓冲区,输入缓冲区,输出缓冲区,传输缓冲区. 例如: 串口属性:BytesToRead(获取接收缓冲区中数据的字节数)--这里提到的是“接收缓冲区” 串 ...

  10. 【知识碎片】JavaScript篇

     40.选择器组合 逗号是多选择器空格 是子子孙孙尖括号 只找儿子 39.失去焦点事件blur $("input").blur(function(){ $("input& ...