java学习之生产者和消费者案例
package com.gh.thread;
/**
* 生产者和消费者案例
* wait和sleep的区别
* wait不让出监视器锁,sleep让出监视器的锁
* @author ganhang
*
*/
/**
* 生产者
* @author ganhang
*
*/
class Producter implements Runnable{
private Food food;
public Producter(Food food){
this.food=food;
}
@Override
public void run() {
for(int i=0;i<100;i++){
if(i%2==0){
food.product("韭菜", "韭菜有益");
}else{
food.product("腰花", "腰花好吃");
}
}
} }
/**
* 消费者
* @author ganhang
*
*/
class Consumer implements Runnable{
private Food food;
public Consumer(Food food) {
this.food=food;
}
@Override
public void run() {
for(int i=0;i<100;i++){
food.get();
}
} }
/**
* 产品对象
* @author ganhang
*
*/
class Food{
private String name;
private String info;
private boolean flag=true;//true表示可以生产,false表示可以消费
//生产产品
public synchronized void product(String name,String info){
if(!flag){//如果为false说明正在消费
try {
//让当前线程进入等待池等待,没有设置时间,需要其他线程唤醒,释放对象锁,让出cpu;
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.setName(name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setInfo(info);
System.out.println(Thread.currentThread().getName()+"--生产出--"+
this.getName()+"-"+this.getInfo());
flag=false;//生产完成表示可以进行消费了
this.notify();//唤醒该监视器的一个线程
}
//消费产品
public synchronized void get(){
if(flag){//如果为ture说明正在生产
try {
this.wait();//同样让它等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"--已送出--"+
this.getName()+"-"+this.getInfo());
flag=true;//消费完可以生产了
this.notify();//唤醒一个线程
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public Food() {
super();
}
public Food(String name, String info) {
super();
this.name = name;
this.info = info;
}
@Override
public String toString() {
return "food [name=" + name + ", info=" + info + "]";
}
public void setInfo(String info) {
this.info = info;
}
}
public class ThreadDemo {
public static void main(String[] args) {
Food f=new Food();
Producter p=new Producter(f);
Consumer c=new Consumer(f);
new Thread(p,"线程p").start();
new Thread(c,"线程c").start();
}
}
输出
线程p--生产出--韭菜-韭菜有益
线程c--已送出--韭菜-韭菜有益
线程p--生产出--腰花-腰花好吃
线程c--已送出--腰花-腰花好吃
线程p--生产出--韭菜-韭菜有益
线程c--已送出--韭菜-韭菜有益
线程p--生产出--腰花-腰花好吃
线程c--已送出--腰花-腰花好吃
线程p--生产出--韭菜-韭菜有益
线程c--已送出--韭菜-韭菜有益
线程p--生产出--腰花-腰花好吃
线程c--已送出--腰花-腰花好吃
线程p--生产出--韭菜-韭菜有益
线程c--已送出--韭菜-韭菜有益
线程p--生产出--腰花-腰花好吃
线程c--已送出--腰花-腰花好吃
线程p--生产出--韭菜-韭菜有益
。。。。
java学习之生产者和消费者案例的更多相关文章
- 同步锁Lock & 生产者和消费者案例
显示锁 Lock ①在 Java 5.0 之前,协调共享对象的访问时可以使用的机 制只有 synchronized 和 volatile . Java 5.0 后增加了一些 新的机制,但并不是一种替代 ...
- GUC-13 生产者和消费者案例-旧
/* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public static void main(String[] args) { C ...
- Java中的生产者、消费者问题
Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...
- 0032ActiveMQ之java编码实现生产者和消费者操作队列queue
今天学习了入门级的用java编写生产者producer和消费者consumer操作activemq的queue队列,为了之后复习回顾,现做整理如下: maven工程的搭建此处不再讲解,在maven工程 ...
- java线程中生产者与消费者的问题
一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费 ...
- C#多线程学习(三) 生产者和消费者
前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...
- Java中的生产者和消费者实例(多线程 等待唤醒机制)
1.什么是等待唤醒 我们实现的效果 创建生产者和消费者 对服装进行生产 和售卖 实现生产一个就消费一个 来观察线程的各种状态 下面是用到的方法: wait()方法:让一个线程进行等待 另外一个线程 ...
- Java 实践:生产者与消费者
实践项目:生产者与消费者[经典多线程问题] 问题引出: 生产者和消费者指的是两个不同的线程类对象,操作同一个空间资源的情况. 需求引出: —— 生产者负责生产数据,消费者负责取走数据 —— 生产者生产 ...
- java中的生产者和消费者的问题
1----使用Java.util.concurrent.locks包中的lock接口取代synchronized,通过ReentrantLock这个已经实现Lock接口的类, 创建ReentrantL ...
随机推荐
- 用ahk脚本自己主动删除flashcookies
手动方法(请戳点击打开链接): 点击桌面左下脚的"開始"键 打开"控制面板" 并点击 "flash player" 项 进入 并点击&quo ...
- $timeout, $interval
$timeout, $interval layout: posttitle: Angular@1.4.3 中文 API 服务篇 $timeout & $intervaldesc: '$ti ...
- w3c教程
http://www.w3cfuns.com/course.php http://www.w3cfuns.com/home.php?mod=space&uid=5434413&do=b ...
- sql update 触发器 可获得被update的行的信息
类型:转载 sql update 触发器 可获得被update的行的信息,需要的朋友可以参考下. 复制代码 代码如下: create trigger TgName on tb for update ...
- objective-C学习笔记(十)协议
协议 Protocol 协议是类的合同约定,只描述外部接口,不提供具体实现.所以,协议其实可以写在类的.h文件中,不去实现就可以了. 协议可以包含以下成员: 属性 (编译器不会和普通interface ...
- 解压版本 Tomcat配置--转
http://qsfwy.iteye.com/blog/429973 一 配置JDK 1.下载jdk下载后,解压,假设为D:\Program Files\Java\jdk1.5.0_08,要确保bin ...
- 笔记 postgresql oid同步
以前学习postgresql的笔记 create table 消耗 OID 如create table my_test_table, 他本身会消耗一个 会在pg_type中插入两条记录_my_test ...
- Java 网络编程(一) 网络基础知识
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951826.html 网络基础知识 网络编程的目的:直接或间接地通过网络协议与其他计算机 ...
- sort 与 qsort
很长一段时间搞不明白 sort 和 qsort 的区别,平时在写程序时习惯了使用 sort ,因为它用起来比 qsort 要简单的多 , 这里详细介绍一下 sort 与 qsort : 给出一个数组 ...
- Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)
关于依赖注入, 这篇博文写的非常简单易懂. https://github.com/android-cn/blog/tree/master/java/dependency-injection 此外, 博 ...