zoukankan      html  css  js  c++  java
  • java学习之生产者和消费者案例

      1 package com.gh.thread;
      2 /**
      3  * 生产者和消费者案例
      4  * wait和sleep的区别
      5  * wait不让出监视器锁,sleep让出监视器的锁
      6  * @author ganhang
      7  *
      8  */
      9 /**
     10  * 生产者
     11  * @author ganhang
     12  *
     13  */
     14 class Producter implements Runnable{
     15     private Food food;
     16     public Producter(Food food){
     17         this.food=food;
     18     }
     19     @Override
     20     public void run() {
     21         for(int i=0;i<100;i++){
     22             if(i%2==0){
     23                 food.product("韭菜", "韭菜有益");
     24             }else{ 
     25                 food.product("腰花", "腰花好吃");
     26             }
     27         }
     28     } 
     29     
     30 }
     31 /**
     32  * 消费者
     33  * @author ganhang
     34  *
     35  */
     36 class Consumer implements Runnable{
     37     private Food food;
     38     public Consumer(Food food) {
     39         this.food=food;
     40     }
     41     @Override
     42     public void run() {
     43         for(int i=0;i<100;i++){
     44             food.get();
     45         }        
     46     }
     47     
     48 }
     49 /**
     50  * 产品对象
     51  * @author ganhang
     52  *
     53  */
     54 class Food{
     55     private String name;
     56     private String info;
     57     private boolean flag=true;//true表示可以生产,false表示可以消费
     58     //生产产品
     59     public synchronized void product(String name,String info){
     60         if(!flag){//如果为false说明正在消费
     61             try {
     62                 //让当前线程进入等待池等待,没有设置时间,需要其他线程唤醒,释放对象锁,让出cpu;
     63                 this.wait();
     64             } catch (InterruptedException e) {
     65                 e.printStackTrace();
     66             }
     67         }
     68         this.setName(name);
     69         try {
     70             Thread.sleep(1000);
     71         } catch (InterruptedException e) {
     72             e.printStackTrace();
     73         }
     74         this.setInfo(info);
     75         System.out.println(Thread.currentThread().getName()+"--生产出--"+
     76                             this.getName()+"-"+this.getInfo());
     77         flag=false;//生产完成表示可以进行消费了
     78         this.notify();//唤醒该监视器的一个线程
     79     }
     80     //消费产品
     81     public synchronized void get(){
     82         if(flag){//如果为ture说明正在生产
     83             try {
     84                 this.wait();//同样让它等待
     85             } catch (InterruptedException e) {
     86                 e.printStackTrace();
     87             }
     88         }
     89             try {
     90                 Thread.sleep(1000);
     91             } catch (InterruptedException e) {
     92                 e.printStackTrace();
     93             } 
     94             System.out.println(Thread.currentThread().getName()+"--已送出--"+
     95                         this.getName()+"-"+this.getInfo());
     96             flag=true;//消费完可以生产了
     97             this.notify();//唤醒一个线程
     98     }
     99     public String getName() {
    100         return name;
    101     }
    102     public void setName(String name) {
    103         this.name = name;
    104     }
    105     public String getInfo() {
    106         return info;
    107     }
    108     public Food() {
    109         super();
    110     }
    111     public Food(String name, String info) {
    112         super();
    113         this.name = name;
    114         this.info = info;
    115     }
    116     @Override
    117     public String toString() {
    118         return "food [name=" + name + ", info=" + info + "]";
    119     }
    120     public void setInfo(String info) {
    121         this.info = info;
    122     }
    123 }
    124 public class ThreadDemo {
    125     public static void main(String[] args) {
    126         Food f=new Food();
    127         Producter p=new Producter(f);
    128         Consumer c=new Consumer(f);
    129         new Thread(p,"线程p").start();
    130         new Thread(c,"线程c").start();
    131     }
    132 }

     输出

    线程p--生产出--韭菜-韭菜有益
    线程c--已送出--韭菜-韭菜有益
    线程p--生产出--腰花-腰花好吃
    线程c--已送出--腰花-腰花好吃
    线程p--生产出--韭菜-韭菜有益
    线程c--已送出--韭菜-韭菜有益
    线程p--生产出--腰花-腰花好吃
    线程c--已送出--腰花-腰花好吃
    线程p--生产出--韭菜-韭菜有益
    线程c--已送出--韭菜-韭菜有益
    线程p--生产出--腰花-腰花好吃
    线程c--已送出--腰花-腰花好吃
    线程p--生产出--韭菜-韭菜有益
    线程c--已送出--韭菜-韭菜有益
    线程p--生产出--腰花-腰花好吃
    线程c--已送出--腰花-腰花好吃
    线程p--生产出--韭菜-韭菜有益

    。。。。

  • 相关阅读:
    gnome3 修改桌面背景图片模式
    记录openSUSE 源码安装node.js
    [转]gnome环境中将家目录下预设的文件夹由中文名称改为英文名称
    Clover config.plist Boot部分
    bootstrap table 实现固定悬浮table 表头并可以水平滚动
    openSUSE 安装compass,mkmf.rb can't find,checking for ffi.h...extconf.rb failed
    读《深入PHP 面向对象、模式与实践》笔记
    openSUSE中启用apache mod_rewrite
    openSUSE安装Composer
    openSUSE 安装LAMP记录
  • 原文地址:https://www.cnblogs.com/ganhang-acm/p/5154359.html
Copyright © 2011-2022 走看看