Java 线程的通讯--生产者和消费者
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 线程的通讯--生产者和消费者的更多相关文章
- JAVA线程通信之生产者与消费者
package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.lo ...
- java 线程并发(生产者、消费者模式)
线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...
- Java 线程间通讯(共享变量方式)
Java线程间通讯,最常用的方式便是共享变量方式,多个线程共享一个静态变量就可以实现在线程间通讯,但是这需要注意的就是线程同步问题. 一.没考虑线程同步: package com.wyf; publi ...
- Java线程间通信--生产者消费者
class ProducerConsumerDemo { public static void main(String[] args) { Resource r = new ...
- JMM之Java线程间通讯——等待通知机制及其经典范式
在并发编程中,实际处理涉及两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息.在共享内存的并发模型里,线程之间共享程序的公共状 ...
- 线程操作案例--生产者与消费者,Object类对线程的支持
本章目标 1)加深对线程同步的理解 2)了解Object类中对线程的支持方法. 实例 生产者不断生产,消费者不断消费产品. 生产者生产信息后将其放到一个区域中,之后消费者从区域中取出数据. 既然生产的 ...
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒: Object类中提供了三个方法: wait():等待 notify():唤醒单个线程 notify ...
- Java并发编程(4)--生产者与消费者模式介绍
一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...
- 多进程(了解):守护进程,互斥锁,信号量,进程Queue与线程queue(生产者与消费者模型)
一.守护进程 主进程创建守护进程,守护进程的主要的特征为:①守护进程会在主进程代码执行结束时立即终止:②守护进程内无法继续再开子进程,否则会抛出异常. 实例: from multiprocessing ...
随机推荐
- Java面试题:栈和队列的实现
面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min()的栈,要 ...
- mysql命令 show slave status\G;命令输出详解
show slave status\G; 命令输出详解 mysql> show slave status\G; *************************** . row ******* ...
- 高速PCB设计注意事项
和SERDES应用相关的高速系统PCB设计注意事项如下: (1)微带(Microstrip)和带状线(Stripline)布线. 微带线是用电介质分隔的参考平面(GND或Vcc)的外层信号层上的布线, ...
- 杂项:UN-APP
ylbtech-杂项:APP 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 10 ...
- UEditor使用有感(红色),保存内容时,会自动添加p标签
UEditor 介绍 UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. 1 入门部署 ...
- 参数传递中编码问题(Get/Post 方式)(一)
用JAVA在做一个支付接口时,需要和表现层的UTF8代码进行报文交换,因JAVA是GBK编码的,因此出现了小插曲.为此,花了点时间,重新梳理一下相关知识点. 以下内容是我转载的,觉得挺好的.... 一 ...
- Linux性能监测:监测目的与工具介绍
性能监测是系统优化过程中重要的一环,如果没有监测.不清楚性能瓶颈在哪里,优化什么呢.怎么优化呢?所以找到性能瓶颈是性能监测的目的,也是系统优化的关键.本文对Linux性能监测的应用类型.底线和监测工具 ...
- DDD学习笔录——提炼问题域之有效提炼知识的模型(三)
方式六:延迟对模型中概念的命名 对领域建模时命名很重要. 因为在不断的知识提炼过程中经常会发现已经被命名的概念与你最初理解的有出入,这时你当初的命名就会变成一个问题.其问题在于 最初选作名称的这个词 ...
- MySQL备份还原之三使用xtrabackup
1 xtrabackup安装 1)解压源码包 tar -xzvf percona-xtrabackup-2.1.7.tar.gz 2)安装perl环境(DBI/DBD) yum install per ...
- Perl基础语法
一.脚本文件perl 代码可以写在一个文本文件中,以 .pl..PL 作为后缀.文件名可以包含数字,符号和字母,但不能包含空格,可以使用下划线(_)来替代空格.一个简单的Perl 文件名:rurun_ ...