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学习之生产者和消费者案例的更多相关文章

  1. 同步锁Lock & 生产者和消费者案例

    显示锁 Lock ①在 Java 5.0 之前,协调共享对象的访问时可以使用的机 制只有 synchronized 和 volatile . Java 5.0 后增加了一些 新的机制,但并不是一种替代 ...

  2. GUC-13 生产者和消费者案例-旧

    /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public static void main(String[] args) { C ...

  3. Java中的生产者、消费者问题

    Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...

  4. 0032ActiveMQ之java编码实现生产者和消费者操作队列queue

    今天学习了入门级的用java编写生产者producer和消费者consumer操作activemq的queue队列,为了之后复习回顾,现做整理如下: maven工程的搭建此处不再讲解,在maven工程 ...

  5. java线程中生产者与消费者的问题

    一.概念 生产者与消费者问题是一个金典的多线程协作的问题.生产者负责生产产品,并将产品存放到仓库:消费者从仓库中获取产品并消费.当仓库满时,生产者必须停止生产,直到仓库有位置存放产品:当仓库空时,消费 ...

  6. C#多线程学习(三) 生产者和消费者

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  7. Java中的生产者和消费者实例(多线程 等待唤醒机制)

    1.什么是等待唤醒 我们实现的效果 创建生产者和消费者  对服装进行生产  和售卖 实现生产一个就消费一个 来观察线程的各种状态 下面是用到的方法: wait()方法:让一个线程进行等待 另外一个线程 ...

  8. Java 实践:生产者与消费者

    实践项目:生产者与消费者[经典多线程问题] 问题引出: 生产者和消费者指的是两个不同的线程类对象,操作同一个空间资源的情况. 需求引出: —— 生产者负责生产数据,消费者负责取走数据 —— 生产者生产 ...

  9. java中的生产者和消费者的问题

    1----使用Java.util.concurrent.locks包中的lock接口取代synchronized,通过ReentrantLock这个已经实现Lock接口的类, 创建ReentrantL ...

随机推荐

  1. Android内存泄漏分析及调试

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...

  2. 开启新的activity获取它的返回值

    1.开始界面 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...

  3. union 和 union all 有什么不同?

    假设我们有一个表 Student, 包括以下字段与数据:drop table student;create table student( idint primary key,name nvarchar ...

  4. php开发中的一些常用统计的日期

    <?php echo '<br>今天:<br>'; echo date("Y-m-d",strtotime("now")), &q ...

  5. RUP(Rational Unified Process)笔记整理

    RUP,统一软件开发过程是一种面向对象且基于网络的程序开发方法论. RUP的思路:Implementing BestPractices ·迭代式开发 在软件开发的早期阶段就想完全.准确的捕获用户的需求 ...

  6. 5.4.1 RegExp实例属性

    RegExp的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息.        1.global:布尔值,表示是否设置了 g 标志.        2.ignoreCase:布尔值,表示 ...

  7. ajax+php如何获取部分请求的信息显示在对应的div中

    我该如何把需要显示的信息显示在文章列表中呢???

  8. 用PyRestful快速构建Tornado下REST APIs 的支持

    一.安装PyRestful库 $ pip install pyrestful 二.使用案例 (一)books_service.py # -*- coding: utf-8 -*- import tor ...

  9. ASP.NET MVC5 学习笔记-3 Model

    1. Model 1.1 添加一个模型 注意,添加属性时可以输入"prop",会自动输入代码段. public class CheckoutAccount { public int ...

  10. NET Core,Ubuntu运行

    NET Core,如何开发跨平台的应用并部署至Ubuntu运行 之前写了一篇博文宣布Rabbit Rpc跨平台了“拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc”,在过程中尝试了如 ...